Initializer List の動作の std::vector と std::array の違い
C では、 std::vector と std::array のInitializer_list の動作std::array は大きく異なります。次のコード スニペットを考えてみましょう:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
std::vector には 1 つの中括弧のみが必要なのに対し、std::array には二重の中括弧が必要なのはなぜですか?
説明
std::vector には、引数として std::initializer_list を取るユーザー定義のコンストラクターがあります。これにより、単一の中括弧を使用した直接リストの初期化が可能になります。
一方、 std::array は、ユーザー定義のコンストラクターを持たない集約型です。代わりに、C から継承された機能である集約初期化を使用します。集約初期化では、二重中括弧を使用した初期化が可能です。
中括弧と = 記号を使用した集約初期化の古い構文も有効です。
std::array<int, 4> y = { { 1, 2, 3, 4 } };
ただし、この構文では、特定の場合に中括弧の省略が許可されますが、std::array を使用した直接リストの初期化では許可されません。 C 標準 (C 11 §8.5.1/11) の脚注には、「リスト初期化の他の用途では中括弧を省略することはできません。」
欠陥レポートと解決案
この制限に対処するために、欠陥レポート (CWG 欠陥 #1270) が提出されました。提案された解決策が採用された場合、 std::array の直接リストの初期化で中括弧の省略が許可され、次が有効になります:
std::array<int, 4> y{ 1, 2, 3, 4 };
以上が`std::array` では初期化に二重中括弧が必要なのに対し、`std::vector` では単一の中括弧のみが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。