C ++数组初始化器

时间:2017-08-07 16:01:04

标签: c++ arrays initializer

在C ++ 14标准draft中,有两个关于数组初始化的提及(我发现):

  1. 第8.5.1节([dcl.init.aggr])第2段:
  2.   

    "当聚合由初始化列表[...]"

    初始化时
    1. 第8.5.2节([dcl.init.string])第1段:
    2.   

      "可以初始化窄字符类型(3.9.1),char16_t数组,char32_t数组或wchar_t数组的数组   通过一个窄字符串文字,char16_t字符串文字,char32_t字符串文字或宽字符串文字,   分别或用括号中的适当类型的字符串文字(2.13.5)。 [...]"

      因此,至少有两种类型的初始值设定项可用于数组:初始化列表和字符串文字。

      标准是否明确提到这些是唯一两个选项?

1 个答案:

答案 0 :(得分:1)

Paragraph 17

[dcl.init]指定了数组的所有可能的初始值设定项。

  

17初始值设定项的语义如下。目标类型是要初始化的对象或引用的类型,源类型是初始化表达式的类型。如果初始化程序不是单个(可能带括号的)表达式,则不定义源类型。

     

(17.1)如果初始化程序是(非括号内的) braced-init-list 或is = braced-init-list ,则该对象或引用列表初始化。

     

(17.2)如果目的地类型是参考类型,请参阅[dcl.init.ref]。

     

(17.3)如果目标类型是字符数组,char16_t数组,char32_t数组或wchar_t数组,初始值设定项是字符串文字,请参阅[dcl.init.string]

     

(17.4)如果初始值设定项为(),则对象进行值初始化。

     

(17.5) 否则,如果目标类型是数组,则程序格式不正确。

(17.2)不适用于数组,因此选项为:

  1. 默认初始化([dcl.init]/12):int x[3];
  2. 值初始化([dcl.init]/17.4):int* x = new int[3]();
  3. 列表初始化([dcl.init]/17.1):int x[] = {1, 2, 3};int x[] {1, 2, 3};
  4. 使用字符串文字([dcl.init]/17.3)进行初始化:char x[] = "text";