根据问题What does string array[] = ""; mean and why does it work?我想问下面代码中 s1 和 s2 之间有什么区别:
int main() {
const char* s1 = { "Hello" }; // strange but work as followed
const char* s2 = "Hello"; // ordinary case
return 0;
}
为什么允许使用额外的花括号?任何对C ++标准的引用都会很有用。
答案 0 :(得分:11)
在C ++ 98(和C ++ 03)中,这很简单;在第8.5条中:
14 - 如果
T
是标量类型,则表示声明T x = { a };
相当于T x = a;
在C ++ 11中,这由列表初始化(8.5.4p3)覆盖:
[...]如果初始化列表具有E类型的单个元素,并且T不是引用类型或 其引用类型与E引用相关,对象或引用从该元素[...]
初始化
我认为这是与Initializing scalars with braces相同的问题。
答案 1 :(得分:-1)
简单的答案是:因为标准是这样说的。 §8.5.2/ 1:
一个char数组(无论是普通字符,有符号字符还是无符号字符 char),char16_t数组,char32_t数组或wchar_t数组都可以 由一个狭义的字符文字char16_t初始化 字符串文字,char32_t字符串文字或宽字符串 文字,分别为或由适当类型的字符串组成 用括号括起来的文字。连续的人物 字符串文字的值初始化的元素 阵列。
(那是C ++ 11,但早期版本说同样的事情,减去 对新类型的引用。)
允许这样做的原因是因为C允许它。至于为什么 C允许,我不知道。