初始化是什么类型:
char a[] = ""; // ??? (copies array content)
char* q = a; // copy-initialization (copies pointer)
// EDIT: originally it was `char q[] = a;` which doesn't compile
在 C 中,这称为“数组初始化”。
在 C++ 中,它看起来像复制初始化,但我不确定。熟悉标准的人可以给我指出它命名的确切段落吗?
C++23 标准对此是这么说的:
普通字符类型数组 (6.8.2)、
char8_t
数组、char16_t
数组、char32_t
数组或 wchar_t
数组可以通过普通字符串文字、UTF-8 字符串文字、UTF 来初始化-16 字符串文字,UTF-32 字符串
分别是文字或宽字符串文字,或用大括号括起来的适当类型的字符串文字(5.13.5)。
此外,char
或 unsigned char
数组可以通过 UTF-8 字符串文字或用大括号括起来的字符串文字来初始化。字符串文字值的连续字符初始化元素
的数组,如有必要,可对源值和目标值进行积分转换 (7.3.9)。
[示例 1 :
char msg[] = "Syntax error on line %s\n";
显示一个字符数组,其成员用字符串文字初始化。请注意,由于
\n
是单个字符,并且附加了尾随 \0
,因此 sizeof(msg)
为 25。 — 结束示例]
初始化器的数量不得多于数组元素的数量。
[示例 2 :
char cv[4] = "asdf"; // error
格式错误,因为没有空间容纳隐含的尾随
\0
。 — 结束示例]
如果初始化器的数量少于数组元素的数量,则每个未显式初始化的元素应为零初始化(9.4)。
该标准没有更具体地提及字符串文字的初始化:“字符串文字可以初始化...的数组”和相应的CharT,这意味着它会退回到简单的聚合初始化。
数组没有复制构造函数或复制赋值运算符。它们是不可修改的左值。
在第一个声明中
char a[] = ""; // ??? (copies array content)
数组
a
的元素由字符串文字 ""
的元素初始化。这是通过字符串文字初始化字符数组所采用的一般规则的一个例外。
第二个声明
char q[] = a; // copy-init (copies pointer)
编译器将根据答案开头指出的原因发出错误消息。
来自 C++ 17 标准(11.6.2 字符数组)
1 窄字符类型数组(6.9.1)、char16_t 数组、char32_t 数组或 wchar_t 数组可以由窄字符串文字初始化, char16_t 字符串文字、char32_t 字符串文字或宽字符串 分别或通过适当类型的字符串文字 用大括号括起来(5.13.5)。值的连续字符 字符串文字初始化数组的元素。 [ 示例:
char msg[] = "Syntax error on line %s\n";
显示一个字符数组,其成员用 a 初始化 字符串字面量。请注意,因为’ ’ 是单个字符并且 因为附加了尾随“ ”,所以 sizeof(msg) 为 25。 — 示例结束 ]