コード:
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
std :: arrayに二重中括弧が必要なのはなぜですか?
std::array<T, N>
は集合体です。ユーザーが宣言したコンストラクターはなく、。をとるコンストラクターもありませんstd::initializer_list
。中括弧を使用した初期化は、Cから継承されたC++の機能である集約初期化を使用して実行されます。
集約初期化の「古いスタイル」では、=
:を使用します。
std::array<int, 4> y = { { 1, 2, 3, 4 } };
この古いスタイルの集計初期化では、余分な中括弧が省略される可能性があるため、これは次と同等です。
std::array<int, 4> y = { 1, 2, 3, 4 };
ただし、これらの余分な中括弧は、「形式の宣言T x = { a };
」(C++11§8.5.1/11)、つまり古いスタイル=
が使用されている場合にのみ省略できます。ブレースの省略を許可するこのルールは、リストの直接初期化には適用されません。ここでの脚注には、「リスト初期化の他の使用法では中括弧を省略できません」と書かれています。
この制限に関する欠陥レポートがあります:CWG欠陥#1270。提案された解決策が採用された場合、他の形式のリスト初期化では中括弧の省略が許可され、以下が整形式になります。
std::array<int, 4> y{ 1, 2, 3, 4 };
(欠陥レポートを見つけるためのVille Voutilainenへのハットチップ。)
は、std::vector
を取り入れるコンストラクターを提供しますが、コンストラクターはなく、std::initializer_list<T>
中括弧で囲まれたinit-listは実際にはとして解釈されませんが、 (中括弧の2番目のセットが由来する)の内部Cスタイル配列の初期化を集約します。の場合、1つは内部Cスタイルのメンバー配列用です)。std::array
{1, 2, 3, 4}
std::initializer_list
std::array
std::array