代码之家  ›  专栏  ›  技术社区  ›  Paul Jurczak

不一致警告“从‘const unsigned char’转换为‘const float’需要缩小转换范围”

  •  8
  • Paul Jurczak  · 技术社区  · 6 年前

    Visual C++2017和gcc 5.4产品 conversion from 'const unsigned char' to 'const float' requires a narrowing conversion 警告 Line B 但不是为了 Line A 在此代码段中:

    #include <iostream>
    
    int main() {
        const unsigned char p = 13;
        const float         q = p;  // Line A
    
        std::cout << q << '\n';
    
        const unsigned char c[3] = {0, 1, 255};
        const float         f[3] = {c[2], c[0], c[1]};  // Line B
    
        for (auto x:f)
            std::cout << x << '\n';
    }
    

    此警告有效吗?为什么? B线 不同于 A线 ?

    1 回复  |  直到 6 年前
        1
  •  5
  •   songyuanyao    6 年前

    警告有效,来自C++11 narrowing conversions 在中禁止 aggregate initialization ;但不适用于 copy initialization (如前所述)。

    如果initializer子句是表达式,则允许按照副本初始化进行隐式转换 , except if they are narrowing (as in list-initialization) (since C++11).

    在C++11之前,聚合初始化中允许缩小转换范围,但现在不再允许。

    列表初始化通过以下方式限制允许的隐式转换 禁止以下行为:

    • 从整数类型到浮点类型的转换,除非源是可以存储其值的常量表达式 完全在目标类型中

    顺便说一句: c[0] ,则, c[1] c[2] not constant expressions ;您可以将数组声明为 constexpr ,即。 constexpr unsigned char c[3] = {0, 1, 255}; 。然后应用例外,并且 Line B 也会很好。