繁体   English   中英

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

[英]Inconsistent warning “conversion from 'const unsigned char' to 'const float' requires a narrowing conversion”

Visual C ++ 2017和gcc 5.4产生conversion from 'const unsigned char' to 'const float' requires a narrowing conversion在代码段中对Line B conversion from 'const unsigned char' to 'const float' requires a narrowing conversion警告,但对于Line A Line B conversion from 'const unsigned char' to 'const float' requires a narrowing conversion警告:

#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';
}

这个警告有效吗? 为什么Line B Line A区别对待?

该警告是有效的,因为从C ++ 11开始,在聚合初始化中禁止缩小转换 但不适用于复制初始化 (与以前一样)。

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

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

list-initialization通过禁止以下行为来限制允许的隐式转换:

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

顺便说一句: c[0]c[1]c[2] 不是常数表达式 您可以将数组声明为constexpr ,即constexpr unsigned char c[3] = {0, 1, 255}; 然后应用异常, 行B也可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM