ホームページ  >  記事  >  バックエンド開発  >  指定されたイニシャライザを使用して、C 20 集合体で継承されたメンバーを初期化できますか?

指定されたイニシャライザを使用して、C 20 集合体で継承されたメンバーを初期化できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 02:44:02417ブラウズ

Can Designated Initializers be Used to Initialize Inherited Members in C  20 Aggregates?

C 20 の指定イニシャライザと集合体

C 20 では、指定イニシャライザは、メンバーを明示的に指定することで集合体の型を初期化する簡潔な方法を提供します。初期化されます。ただし、継承されたクラスの初期化に関しては、この構文には制限があります。

次のコード スニペットを考えてみましょう:

<code class="cpp">struct Person {
    std::string name;
    std::string surname;
    unsigned age;
};

struct Employee : Person {
    unsigned salary;
};</code>

Person と Employee は両方とも集計ですが、次の例では、次のコードを使用して Employee を初期化しようとしています。指定されたイニシャライザは失敗します:

<code class="cpp">Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}};</code>

これは、C 標準では、指定されたイニシャライザはクラスの直接の非静的データ メンバーを初期化するためにのみ使用できると指定されているためです。上記の例では、salary は直接の基本クラス person ではなく、派生クラス Employee のメンバーであるため、指定された初期化は許可されません。

代わりに、継承されたメンバーを初期化するには、従来のリスト初期化を使用する必要があります。

<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>

または、コメントで指摘されているように、ネストされた指定初期化子リストを使用して基本クラスを初期化できます:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>

この場合、直接の基本クラスが初期化されます指定された初期化子リストを使用しますが、Employee クラス全体は通常の初期化子リストを使用して初期化されます。

以上が指定されたイニシャライザを使用して、C 20 集合体で継承されたメンバーを初期化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。