ホームページ > バックエンド開発 > C++ > C 初期化子リストで余分な中括弧が必要になる場合があるのはなぜですか?

C 初期化子リストで余分な中括弧が必要になる場合があるのはなぜですか?

Patricia Arquette
リリース: 2024-12-04 14:18:14
オリジナル
808 人が閲覧しました

Why Are Extra Braces Sometimes Necessary in C   Initializer Lists?

初期化子リストに追加の中括弧が必要な場合

C では、初期化子リストは集約オブジェクトまたは配列を初期化する便利な方法を提供します。ただし、std::array や集約構造などの特定のデータ構造を扱う場合、構文に余分な中括弧が必要になるため、多くのプログラマーはなぜなのか疑問に思っています。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート