C では、初期化子リストは集約オブジェクトまたは配列を初期化する便利な方法を提供します。ただし、std::array や集約構造などの特定のデータ構造を扱う場合、構文に余分な中括弧が必要になるため、多くのプログラマーはなぜなのか疑問に思っています。
std::array は、集約データ型として宣言された固定サイズのコンテナーです。つまり、ユーザー定義のコンストラクターがありません。 std::array は集合体として、内部配列を含むメンバーを直接初期化します。
内部配列を直接初期化するには、追加の中かっこが必要です。次の例を考えてみましょう。
std::array<int, 2> a1 = {{0, 1}, {2, 3}};
ここで、{0, 1} と {2, 3} を囲む中括弧は、初期化が a1 内の内部配列に対するものであることを示すため、必須です。これらの中括弧がないと、初期化子が多すぎるためにコードでコンパイル エラーが発生します。
std::array とは対照的に、double のような基本型は初期化子リストには追加の中括弧が必要です。これは、それらが集合体ではないためです。例:
std::array<double, 2> a2 = {0.1, 2.3};
この場合、a2 は double 値の配列です。 double は集計ではないため、初期化には内部配列が関与せず、追加の中括弧は必要ありません。
追加の中括弧の要件は std::array を超えて拡張されます。 。集計を含む他の型にもそれらが必要です。例:
struct B { int foo[2]; }; B meow1 = {1, 2}; // OK (fully-braced) B bark1 = {{1, 2}}; // OK (extra braces for inner aggregate) struct C { int a, b; }; C meow2 = {1, 2}; // OK (completely elided braces) C bark2 = {{1, 2}}; // OK (extra braces for inner aggregate) struct D { int foo[2]; }; D meow3 = {{1, 2}, {3, 4}}; // error (neither braced-elided nor fully-braced) D bark3 = {{{1, 2}, {3, 4}}}; // OK (extra braces for inner aggregate)
要約すると、std::array や特定の構造体のような集合体を初期化する場合、初期化子リストには追加の中括弧が必要です。これは、内部配列または内部配列の初期化を示すためです。集合体のメンバー。この違いを理解することは、コンパイル エラーを回避し、そのようなデータ構造を正しく初期化するために重要です。
以上がC 初期化子リストで余分な中括弧が必要になる場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。