为什么包含字符串文字的初始化程序有效初始化`char`数组?

时间:2011-11-09 11:54:01

标签: c++

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

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

那么是什么让这个初始化有效?它有这样的理由吗?


同样,char c[] = {"aa"};编译,打印c会导致输出“aa”。

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

3 个答案:

答案 0 :(得分:5)

虽然它可能不一定直观,但只允许 ;两个标准都有一个明确的规则:

  

[2003: 8.5.2/1]: char数组(无论是普通charsigned char还是   unsigned char可以通过 string-literal 进行初始化(可选)   用括号括起来; 一个wchar_t数组可以用宽度来初始化    string-literal (可选地括在大括号中);连续的人物    string-literal 初始化数组的成员。 [..]

     

[n3290: 8.5.2/1]: 字符数组(无论plain charsigned char还是   unsigned char),char16_t数组,char32_t数组或wchar_t数组可以   由一个狭义的字符文字char16_t字符串文字初始化,   char32_t字符串文字或宽字符串文字,或 by   用括号括起来的适当类型的字符串文字。连续   字符串文字的值的字符初始化元素   数组。

我无法解释为什么委员会这样做了。

答案 1 :(得分:3)

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

struct S { int x, char c };
S s = {5, 'a'};

int arr[] = {5, 6, 7};

/* (my guess) out of consistency */
int z = { 4 };

因为字符串文字可以分配给char数组和指针

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

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

答案 2 :(得分:0)

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

  

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

     

6.7.8 / 14:字符类型数组可以用字符串文字初始化,可选择用大括号括起来。

     

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

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