我具有此功能,用于根据极性表示法创建矢量,其中使用了括号初始化程序:
// Constructs a 2D vector from XY-coordinates.
inline vector2(float x, float y) : x_(x), y_(y) { }
// Constructs a 2D vector from polar coordinates
static vector2 polar(float r, float phi) {
return {r * cos(phi), r * sin(phi)};
}
在MSVS中,一切似乎都很好,但是g ++编译器显示的警告对我来说似乎很奇怪:
vector2.h:37:23: warning: narrowing conversion of ‘(((double)r) * cos(((double)phi)))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
return {r * cos(phi), r * sin(phi)};
~~^~~~~~~~~~
如果使用构造函数,警告消失:
// Constructs a 2D vector from polar coordinates
static vector2 polar(float r, float phi) {
return vector2(r * cos(phi), r * sin(phi));
}
为什么会出现此警告?这是否意味着编译后的程序将进行从float
到double
并再回到float
的不必要的转换?
这取决于您在每个编译器中具有哪种警告设置,事实是:
cos()
返回类型是double
(通常为8个字节),因此,使用它时,会导致带有浮点数的算术运算(通常为4个字节),隐式转换是从float
到double
(较小)到更大的类型),如果再将其存储在float
中,则存在从较大的类型到较小的类型的隐式转换,可能会丢失数据,因此出现警告。
如果使用更严格的警告配置,您将在MSVC中收到相同的警告。