gcc在+运算符中缩小转换

时间:2017-06-29 18:55:12

标签: c++ gcc

我试图用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?除了强制转换为短整数之外,还有什么好的解决方案吗?

1 个答案:

答案 0 :(得分:8)

这是由于integral promotion

  

小积分类型(例如char)的prvalues可以转换为   较大整数类型的prvalues(例如int)。特别是,   算术运算符不接受小于int的类型   参数,并在之后自动应用积分促销   如果适用,左值到右值的转换。总是这种转换   保留价值。

因此,getFoo() + getBar()的类型为 int ,这会导致上述警告。

要取消警告,您可以使用 static_cast

static_cast<short>(getFoo() + getBar())