[英]Invalid conversion from ‘const char*’ to ‘unsigned char*’
[英]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.