事实证明,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"
也是如此。
答案 0 :(得分:5)
虽然它可能不一定直观,但只允许 ;两个标准都有一个明确的规则:
[2003: 8.5.2/1]:
char
数组(无论是普通char
,signed char
还是unsigned char
)可以通过 string-literal 进行初始化(可选) 用括号括起来; 一个wchar_t
数组可以用宽度来初始化 string-literal (可选地括在大括号中);连续的人物 string-literal 初始化数组的成员。 [..]
[n3290: 8.5.2/1]:
字符数组(无论plain char
,signed 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有这个。