初始化字符串时额外的花括号

时间:2014-01-31 14:01:52

标签: c++ initialization

根据问题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 ++标准的引用都会很有用。

2 个答案:

答案 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允许,我不知道。