如何在构造具有不同类型元素的矢量副本时显式转换?

Pau*_*zak 5 c++ stl visual-c++

我正在制作q矢量的副本v,但元素类型不同并且可以隐式转换:

vector<int>   v = {1, 2, 3, 2};
vector<float> q(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

此代码使用关于类型转换的模板barf(警告)进行编译.什么是明确转换并避免警告的方法?

编辑

我正在使用警告级别为3(/ W3)的Visual Studio 2013.这是警告信息的顶部:

warning C4244: 'initializing' : conversion from 'int' to 'float', possible loss of data ...

R S*_*ahu 3

C++ 标准草案 (N3337) 对浮点转换有这样的规定。

\n
\n

4.9 浮点积分转换 [conv.fpint]

\n

2 整数类型或无作用域枚举类型的纯右值可以转换为浮点类型的纯右值。如果可能的话,结果是准确的。如果要转换的值在可以表示的值范围内,但无法准确表示该值,则它是下一个较低或较高可表示值的实现定义选择。[注意:如果整数值不能精确地表示为浮点类型的值,则会发生精度损失。\xe2\x80\x94尾注] 如果正在转换的值超出了可以表示的值范围,则行为未定义。

\n
\n

如果 an 的值范围int超出 a 的值范围,则该警告是可以理解的float则该警告是可以理解的。

\n

如果 an 的取值范围int在 a 的取值范围内float,则编译器警告过于热心。

\n

我会尝试@Nawaz 的建议来消除编译器警告:

\n
std::transform(begin(v), end(v),\n    std::back_inserter(q), [](int i) { return static_cast<float>(i); });\n
Run Code Online (Sandbox Code Playgroud)\n

  • Nawaz 的解决方案更难阅读且速度较慢。我认为为了消除警告而付出的代价太大了。 (2认同)