84

コード:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};

std :: arrayに二重中括弧が必要なのはなぜですか?

4

2 に答える 2

71

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へのハットチップ。)

于 2012-07-09T17:32:18.557 に答える
31

は、std::vectorを取り入れるコンストラクターを提供しますが、コンストラクターはなく、std::initializer_list<T>中括弧で囲まれたinit-listは実際にはとして解釈されませんが、 (中括弧の2番目のセットが由来する)の内部Cスタイル配列の初期化を集約します。の場合、1つは内部Cスタイルのメンバー配列用です)。std::array{1, 2, 3, 4}std::initializer_liststd::arraystd::array

于 2012-07-09T17:33:09.883 に答える