g ++编译器中的奇怪的隐式转换警告

问题描述 投票:2回答:1

我具有此功能,用于根据极性表示法创建矢量,其中使用了括号初始化程序:

// 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));
}

为什么会出现此警告?这是否意味着编译后的程序将进行从floatdouble并再回到float的不必要的转换?

c++ implicit-conversion narrowing
1个回答
0
投票

这取决于您在每个编译器中具有哪种警告设置,事实是:

cos()返回类型是double(通常为8个字节),因此,使用它时,会导致带有浮点数的算术运算(通常为4个字节),隐式转换是从floatdouble(较小)到更大的类型),如果再将其存储在float中,则存在从较大的类型到较小的类型的隐式转换,可能会丢失数据,因此出现警告。

如果使用更严格的警告配置,您将在MSVC中收到相同的警告。

© www.soinside.com 2019 - 2024. All rights reserved.