我试图用GCC 6编译一些相当简单的C ++代码,但是获得了一个缩小的转换警告。这是有问题的,因为我们将警告视为错误。
struct S {
short int a;
short int b;
};
short int getFoo();
short int getBar();
std::array<S, 2> arr = {{
{5, getFoo()},
{3, getFoo() + getBar()} // Narrowing conversion here?
}};
您可以在https://godbolt.org/g/wHNxoc处查看此代码。 GCC表示getFoo()+ getBar()正在从int缩小到short int。什么导致upcast到int?除了强制转换为短整数之外,还有什么好的解决方案吗?
答案 0 :(得分:8)
这是由于integral promotion:
小积分类型(例如char)的prvalues可以转换为 较大整数类型的prvalues(例如int)。特别是, 算术运算符不接受小于int的类型 参数,并在之后自动应用积分促销 如果适用,左值到右值的转换。总是这种转换 保留价值。
因此,getFoo() + getBar()
的类型为 int ,这会导致上述警告。
要取消警告,您可以使用 static_cast :
static_cast<short>(getFoo() + getBar())