[英]Difference in initializing char-array and char with integer literals
在我的系统( 4.13.11-1-ARCH,gcc 7.2.0 )上signed
char
。 初始化带有integer literal
的char
数组时,如下所示:
const char mydata[] = {
0x80
};
我收到以下错误:
error: narrowing conversion of ‘128’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]
但是,当我改为执行const char data = 0x80
,编译器并不担心任何缩小,尽管它当然会发生。 输出为7F
,最高正有signed char
值。
为什么编译器在两种情况下都不会同样担心截断?
这实际上是应该首选{}
初始化的原因之一:它不允许缩小转换。 与此相反,旧的初始化方式(如const char data = 0x80
)确实允许缩小转换。
形式为const char c = 0x80
初始化程序是比初始化程序列表更旧的构造,后面已经介绍过。 因此可以为初始化程序列表定义更严格的规则,而这些规则不适用于“较旧”的初始化程序(可能是因为不会超出必要的“旧”代码)。
因此, 此在线c ++标准草案中定义的初始化列表禁止此类缩小:
8.5.1聚合
(2)当聚合由初始化列表初始化时,如[dcl.init.list]中所指定的,初始化列表的元素被视为聚合成员的初始化者,增加下标或成员顺序。 每个成员都是从相应的initializer子句复制初始化的。 如果initializer子句是一个表达式,并且转换表达式需要缩小转换([dcl.init.list]),则程序格式错误。 ...
顺便说一句:如果你使用像const char data { 0x80 }
这样的大括号初始化器,你也会得到一个错误。 因此更严格的规则是由于括号初始化器/初始化器列表,而不是由于您是初始化数组还是标量值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.