「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > `std::array` ではイニシャライザ リストに二重中括弧が必要なのはなぜですか?

`std::array` ではイニシャライザ リストに二重中括弧が必要なのはなぜですか?

2024 年 11 月 20 日に公開
ブラウズ:578

Why Does `std::array` Require Double Curly Braces in Initializer Lists?

初期化子リストの動作: std::vector と std::array の違い

一方、std::vector と std::array はC の両方のコンテナーでは、初期化子リストでの動作が異なります。この記事では、集計の初期化の複雑さを調査し、std::array に二重中括弧が必要な理由を理解します。

std::vector と std:: を初期化する次のコード スニペットを考えてみましょう。配列:

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

std::vector 初期化

std::vector をサポートユーザー定義のコンストラクター (std::initializer_list を受け入れるコンストラクターを含む)。したがって、余分な中括弧を必要とせずに、中括弧を使用して x を直接初期化できます。

std::array Initialization

std::vector とは異なり、std::arrayユーザー定義のコンストラクターを持たない集計です。代わりに、C から継承された機能である集合体初期化に依存します。

「古いスタイル」集合体初期化では、等号とコロンが使用されます:

std::array y = { { 1, 2, 3, 4 } };

ただし、直接リスト初期化 (C 11 で導入) を使用する場合、 this = 構文は無効になりました。さらに、余分な中括弧を省略できる中括弧省略は、古い形式の = 構文を使用した宣言でのみ許可されます。直接リストの初期化では、追加の中括弧が必須です。

CWG 欠陥

CWG 欠陥レポート (CWG 欠陥 #1270) は、中括弧の省略を許可することでこの制限を解決することを目的としています。他の形式のリスト初期化。採用された場合、次のコードは整形式になります:

std::array y{ 1, 2, 3, 4 };

結論として、初期化子リストを含む std::vector と std::array の間の動作は、それぞれユーザー定義のコンストラクターを持つクラスと、集合体の初期化に依存する集合体としての基本的な特性に由来します。 std::array が集合体初期化のルールに準拠するには二重中括弧が必要ですが、 std::vector では、古いスタイルの集合体初期化構文に依存せずに、単一の中括弧セットを使用して直接初期化できます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3