为什么包含字符串文字的初始化器对初始化“char”数组有效

Why is an initialiser containing a string literal valid to initialise a `char` array?

本文关键字:初始化 char 有效 数组 包含 字符串 文字 为什么      更新时间:2023-10-16

事实证明,char c[] = {"a"};在C++03和C++11中都是完全有效的。

我不希望它是,因为它是一个char数组而不是char const* ,我希望大括号初始化器需要其每个"项目"的兼容类型。它有一个项目,那就是char const*而不是char

那么,是什么使此初始化有效呢?这样做有理由吗?


类似地,char c[] = {"aa"};编译,打印c结果为输出"aa"。

当然,我希望char c[]{"a"}在 C++11 中有效,但这不一样!同样,char c[] = {'a'}在两者中都很明显,char c[] = "a"也是如此。

虽然它可能不一定是直观的,但它只是被允许的;在这两个标准中都有一个不同的规则:

[2003: 8.5.2/1]: char数组(无论是纯charsigned char 还是 unsigned char ( 可以通过字符串文本(可选(初始化 用大括号括起来(;wchar_t数组可以通过宽 字符串文字(可选地括在大括号中(;连续字符 的字符串文本初始化数组的成员。[..]

[n3290: 8.5.2/1]: 字符数组(无论是plain charsigned char还是 unsigned char (、char16_t数组、char32_t数组或wchar_t数组可以 由窄字符文本初始化,char16_t字符串文本, 分别char32_t字符串文本或宽字符串文本,或按 括在大括号中的适当类型的字符串文本。连续 字符串文本值的字符初始化元素 的数组。

不过,我无法解释为什么委员会会这样做。

量类型也可以使用大括号初始化(就像结构和数组一样(。

struct S { int x, char c };
S s = {5, 'a'};
int arr[] = {5, 6, 7};
/* (my guess) out of consistency */
int z = { 4 };

并且由于字符串文字可以分配给字符数组和指针

char arr[] = "literal";
char* ptr = "another";

允许char arr[] = { "literal" };似乎也很合适。

我想是为了C兼容性吗?实际上,T x = { value of T };也适用于其他类型的T。在C99标准中,

6.7.8/11:标量的初始值设定项应为单个表达式,可以选择括在大括号中

6.7.8/14:字符类型的数组可以通过字符串文本初始化,可以选择括在大括号中。

6.7.8/15:元素类型与wchar_t兼容的数组可以通过宽字符串文本初始化,可以选择用大括号括起来

我不知道为什么C会有这个。