2017-08-07 188 views
1

在C++ 14標準draft,有兩個提到(我發現)關於數組初始化:C++數組初始化

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

「當聚集體是由初始化列表初始化[...]」

  • 第8.5節。 2([dcl.init.string])第1段:
  • 「窄字符類型(3.9.1),char16_t陣列,char32_t陣列或陣列的wchar_t的陣列可以由窄初始化 字符串文字,char16_t字符串文字,char32_t字符串文字或寬字符串文字,分別爲 ,或者由大括號(2.13.5)中包含的適當類型的字符串文字組成。 [...]」

    因此至少有兩種類型的初始化的,可用於數組:初始化列表和字符串

    明確是否標準一提的是,這些都是只有兩個選項?

    +0

    不可以,因爲數組也可以是默認值和初始值。 –

    +0

    我的措辭可能不好。我指的是可用於初始化數組的其他類型的(非空)初始化器。 – user42768

    回答

    1

    [dcl.init]Paragraph 17指定數組所有可能的初始化。

    17的初始化器的語義如下。目標類型是被初始化的對象或引用的類型,源類型是初始化表達式的類型。如果初始化程序不是單個(可能爲括號)表達式,則不定義源類型。

    (17.1)如果初始化爲(非括號內)支撐-INIT列表或爲= 支撐-INIT列表,對象或參考列表是初始化。

    (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";