最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# ネストする集成体初期化における波カッコ省略を許可 [N3653](C++14)

このページはC++14に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++11では、集成体初期化とリスト初期化の両方を含む場合、二重に波カッコを書くことが必須となっていた。そのため、`public`メンバ変数として組み込み配列を持つ`std::array`クラスのオブジェクトを初期化する場合、以下のように、不要とも思える二重の波カッコを書かなければならなかった：

    std::array<int, 3> ar = {{ 1, 2, 3 }}; // OK :
    //std::array<int, 3> ar = { 1, 2, 3 }; // コンパイルエラー！本当はこう書きたい

C++14ではこの制限が緩和され、内側の波カッコを省略できることになった：

    std::array<int, 3> ar1 = {{ 1, 2, 3 }}; // OK : これまで通り
    std::array<int, 3> ar2 = { 1, 2, 3 };   // OK : 波カッコが一組でよくなった

この変更は、多次元配列を初期化する際に通常以下のように書くものを：

    int x[2][2] = {{1, 2}, {3, 4}};

以下のように内側の波カッコを省略して書けるのと同じ規則を、集成体初期化とリスト初期化の組み合わせに対しても当てはめるものである：

    int x[2][2] = {1, 2, 3, 4};

## 参照

- CWG Issue 1270. Brace elision in array temporary initialization
- vector/arrayとUniform initialization+Initializer list - yohhoyの日記
- initializer-listによるaggregate初期化の制約緩和 - yohhoyの日記
- N3653 - Member initializers and aggregates