初始化char数组和具有整数文字的char时的差异
Difference in initializing char-array and char with integer literals
在我的系统(4.13.11-1-ARCH,gcc 7.2.0)上,char
是signed
。当用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]中指定,初始值设定项列表的元素为作为聚合成员的初始值设定项,在递增中下标或成员顺序。每个成员都是从相应的初始值设定项子句如果初始值设定项子句是表达式,并且需要缩小转换([dcl.init.list])转换表达式,程序格式不正确。。。
BTW:如果使用像const char data { 0x80 }
这样的大括号初始值设定项,也会出现错误。因此,更严格的规则是由于大括号初始化器/初始化器列表,而不是由于初始化数组还是标量值。
相关文章:
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 来自 cpp首选项的用户定义的 const char* 文字示例
- 使用 const char * 文字作为 std::map 键是否安全
- 在同一分配语句中进行const char*的多个字符串文字
- 为什么通过添加字符串文字和char初始化时,为什么不打印字符串
- 当返回一系列字符或指针到char文字时的区别
- 初始化char数组和具有整数文字的char时的差异
- 警告从char文字转换为char*
- 为什么允许将字符串文字分配给 C++ 中 char * 类型的指针
- 不赞成将字符串文字转换为char*
- 为什么gcc允许字符串文字大于数组的char数组初始化
- C 和 C++ 字符串文字弃用 char * = "stringLiteral" ;
- 在C 中,这是用字符串文字初始化char数组的好习惯
- 当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 从字符串文字转换为char*
- 为什么我可以将字符串文字初始化为const char*和QString,而不是QString*
- 如何使用字符串文字优雅地初始化 vector<char *>?