イニシャライザ リストの動作: std::vector と std::array の違い
std::vector と std::array はC の両方のコンテナーでは、初期化子リストでの動作が異なります。この記事では、集約の初期化の複雑さを探り、std::array に二重中括弧が必要な理由を理解します。
std::vector と std:: を初期化する次のコード スニペットを考えてみましょう。配列:
std::vector<int> x{1,2,3,4}; std::array<int, 4> y{{1,2,3,4}};
std::vector初期化
std::vector は、std::initializer_list を受け入れるものを含むユーザー定義のコンストラクターをサポートします。したがって、余分な中括弧を必要とせずに、中括弧を使用して x を直接初期化できます。
std::array 初期化
std::vector とは異なり、std::arrayユーザー定義のコンストラクターを持たない集計です。代わりに、C から継承された機能である集約の初期化に依存します。
「古いスタイル」の集約の初期化では、等号とコロンが使用されます。
std::array<int, 4> y = { { 1, 2, 3, 4 } };
ただし、直接使用する場合は、リストの初期化 (C 11 で導入) では、この = 構文は無効になりました。さらに、余分な中括弧を省略できる中括弧省略は、古い形式の = 構文を使用した宣言でのみ許可されます。直接リストの初期化では、追加の中括弧が必須です。
CWG 欠陥
CWG 欠陥レポート (CWG 欠陥 #1270) は、中括弧の省略を許可することでこの制限を解決することを目的としています。他の形式のリスト初期化。採用された場合、次のコードは整形式になります:
std::array<int, 4> y{ 1, 2, 3, 4 };
結論として、初期化子リストを持つ std::vector と std::array の動作の違いは、クラスとしての基本的な特性に起因します。ユーザー定義のコンストラクターと集合体の初期化に依存する集合体です。 std::array が集合体初期化のルールに準拠するには二重中括弧が必要ですが、 std::vector では、古いスタイルの集合体初期化構文に依存せずに単一の中括弧セットを使用して直接初期化できます。
以上が`std::array` がイニシャライザ リストに二重中括弧を必要とするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。