ホームページ > バックエンド開発 > C++ > 集計の C 初期化子リストで外側の中括弧が必要になるのはどのような場合ですか?

集計の C 初期化子リストで外側の中括弧が必要になるのはどのような場合ですか?

Patricia Arquette
リリース: 2024-12-08 12:48:12
オリジナル
453 人が閲覧しました

When are Outer Braces Necessary in C   Initializer Lists for Aggregates?

集約および POD 構造の初期化子リストで外側の中括弧を省略することに関する混乱

C プログラミングの領域では、初期化子リストでの中括弧の使用。具体的には、プログラマは、外側の中括弧が特定の集約型には必要であるが、他の集約型には必要ではないというシナリオに遭遇する可能性があります。この記事は、このトピックをさらに深く掘り下げ、外側の中括弧を省略できる場合について説明することを目的としています。

問題

Visual C 2010 で次のコードをコンパイルするとき、エラー メッセージが生成されます:

struct A
{
    int foo;
    double bar;
};

std::array<A, 2> a1 = 
  // error C2078: too many initializers
  {
    {0, 0.1},
    {2, 3.4}
  };

// OK
std::array<double, 2> a2 = {0.1, 2.3};
ログイン後にコピー

このエラーは、初期化子が多すぎることを示します。 a1、追加の中括弧が必要であることを示唆しています。ただし、a2 の外側の中括弧を省略してもエラーは発生しません。この矛盾により、なぜ外側の中括弧が a1 には必要であるのに、a2 には必要ないのかという疑問が生じます。

説明

この違いの背後にある理由を理解する鍵は、 std::array の性質。 std::array は集合体および Plain Old Datatype (POD) として分類されますが、他の標準ライブラリ コンテナーは分類されません。ユーザー定義のコンストラクターを持つコンテナーとは異なり、std::array にはコンストラクターがありません。最初のデータ メンバーはサイズ N の配列で、テンプレート引数として指定されます。このデータ メンバーは、初期化子リストを使用して直接初期化されます。追加の中括弧は、初期化中の内部配列を囲むため必要です。

この概念をさらに説明するために、次のように定義されるカスタム集約型 Aarray を考えてみましょう。

// Custom aggregate with no user-defined constructor
struct Aarray
{
   A data[2];  // An internal array
};
ログイン後にコピー

Initializing thisこの構造では、内部配列の開始と終了を示すために中括弧を使用する必要があります。 Initialized:

Aarray a1 =
{
  {  // Begins initialization of the internal array

        { // Initializes the first element of the internal array

           0, 0.1

        }, // Ends initialization of the first element

       {2, 3.4}  // Initializes the second element of the internal array

  } // Ends initialization of the internal array
};

// ERROR: Too many initializers if not using braces
Aarray b1 =
{
   0, 0.1,
   2, 3.4
};
ログイン後にコピー

Double の場合

std::array の場合、double は集約タイプ。代わりに、 std::array を使用します。プリミティブの集合体とみなされます。次のコードは、プリミティブ値が集合体内で直接初期化されるため、外側中括弧なしでも有効です。

std::array<double, 2> a2 = {0.1, 2.3};
ログイン後にコピー

中括弧の使用法に関する明確化

C 標準では、次のガイドラインが提供されています。初期化子リストでの中括弧の使用。 C 11 仕様のセクション §8.5.1/11 では、initializer-list が左中括弧で始まる場合、後続の initializer-clause の各コンマ区切りリストがサブ集合のメンバーを初期化すると述べています。一方、サブ集合体の初期化子リストが左中括弧で始まらない場合は、サブ集合体のメンバーを初期化するために十分な初期化子節のみが使用され、残りの初期化子節は次の集約メンバーを初期化します。

結論

初期化子リストでの外側中括弧の使用は、集合体や std::array などの POD 構造にとって重要です。これらの型にはユーザー定義のコンストラクターがなく、内部配列が直接初期化されるためです。一方、プリミティブ型の場合は、プリミティブ値が集合体内で直接初期化されるため、外側の中括弧を省略できます。これらのケースの違いを理解することで、プログラマは正しい初期化を保証し、コンパイラ エラーを回避できます。

以上が集計の C 初期化子リストで外側の中括弧が必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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