【问题标题】:gcc narrowing conversion in + operator+运算符中的gcc缩小转换
【发布时间】:2017-06-29 18:55:11
【问题描述】:

我正在尝试使用 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。是什么导致向上转换为 int?除了强制转换为 short int 之外,这里有什么好的解决方案吗?

【问题讨论】:

标签: c++ gcc


【解决方案1】:

这是由于integral promotion:

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

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

要抑制警告,您可以使用 static_cast

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多