ホームページ > バックエンド開発 > C++ > C 初期化子リストで外側の中括弧を省略する場合は?

C 初期化子リストで外側の中括弧を省略する場合は?

Barbara Streisand
リリース: 2024-12-17 09:27:24
オリジナル
640 人が閲覧しました

When to Omit Outer Braces in C   Initializer Lists?

初期化リストで外側の中括弧を省略する場合

C では、構造体や配列などの集約型を初期化するときに、初期化子リストで外側の中括弧を使用するかどうかの問題です。 POD (Plain Old Data) であり、std::array などのユーザー定義コンストラクターを持たない集約型の場合は、外側の中かっこが必要です。ただし、組み込み型など、この制限がない集約の場合、これらの中括弧は省略できます。

POD 集約の明示的な中括弧

この例では、 std::array std::array は集約であり POD 型であるため、a1 には明示的な中括弧が必要です。集合体の最初のメンバーはサイズ N の配列で、N はテンプレート引数として渡されます。このメンバーを直接初期化するには、内部配列に追加の中括弧を使用する必要があります。間違ったコード例:

std::array<A, 2> a1 = 
{
  {0, 0.1},
  {2, 3.4}
};
ログイン後にコピー

内中括弧が欠落しているため、コンパイラーは「初期化子が多すぎます」と報告します。中かっこを使用した正しい初期化は次のとおりです。

std::array<A, 2> a1 = 
{
  {{
    {0, 0.1},
    {2, 3.4}
  }}
};
ログイン後にコピー

非 POD 集合体の中括弧の省略

POD 集合体とは対照的に、非 POD 集合体は組み込み型と同様です初期化子リストに明示的な外側中括弧を必要としません。たとえば、次の例:

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

には、内部配列の中括弧が含まれていません。これは、double が集合体ではなく、初期化子リストが構成要素である double 要素を直接初期化するためです。

標準からの追加の洞察

C 標準では、次の場合に関するガイダンスが提供されています。初期化子リストでは外側の中括弧を省略できます:

  • 初期化子リストが左で始まる場合中かっこを使用すると、サブ集合体のすべてのメンバーが初期化され、余分な中かっこは必要ありません。
  • 初期化子リストが左中かっこで始まらない場合、リストを埋めるのに十分な初期化子句のみがリストから取得されます。現在のサブ集合体、および残りの句は集合体の次のメンバーを初期化します。

これにより、両方の中かっこを使用した初期化が可能になります。また、initializer-clause の数が初期化されるメンバーの数と一致する限り、中括弧は不要です。

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

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