gcc在+运算符中缩小转换

Bra*_*rad 4 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?
}};
Run Code Online (Sandbox Code Playgroud)

您可以在https://godbolt.org/g/wHNxoc上查看此代码.GCC表示getFoo()+ getBar()正在从int缩小到short int.什么导致upcast到int?除了强制转换为短整数之外,还有什么好的解决方案吗?

Edg*_*jān 8

这是由于整体推广:

小整数类型(例如char)的prvalues可以转换为更大整数类型的prvalues(例如int).特别是, 算术运算符不接受小于int的类型作为参数,并且在左值到右值转换后自动应用整数促销(如果适用).此转换始终保留该值.

因此,getFoo() + getBar()有一种int类型,导致上述警告.

要禁止警告,您可以使用static_cast:

static_cast<short>(getFoo() + getBar())
Run Code Online (Sandbox Code Playgroud)