ホームページ > バックエンド開発 > C++ > 指定された初期化子を使用して C 20 の基本クラスのメンバーを初期化できますか?

指定された初期化子を使用して C 20 の基本クラスのメンバーを初期化できますか?

Mary-Kate Olsen
リリース: 2024-10-29 19:06:30
オリジナル
689 人が閲覧しました

 Can Designated Initializers be Used to Initialize Base Class Members in C  20?

C 20 の指定初期化子: 制限事項の説明

C 20 で導入された指定初期化子を使用すると、集約のメンバーの初期化の順序を明示的に指定できます。 。ただし、最近、派生クラスでの使用に関して疑問が生じています。

提供されたコード例:

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

struct Employee : Person
{
    unsigned salary{DEFAULT_SALARY};
};

int main()
{
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile
    Employee e2 {.salary{55000}}; // warning: missing initializer for base class member
}</code>
ログイン後にコピー

指定された初期化子は初期化にしか使用できないため、コードは e1 のコンパイルに失敗します。派生クラスの非静的メンバーを直接呼び出します。つまり、指定されたイニシャライザを使用して基本クラスのメンバーを直接初期化することはできません。

これを解決するには、次のアプローチを使用できます。

  • 従来のリストの初期化:

    <code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
    ログイン後にコピー
  • ネストされた指定初期化子リスト:

    <code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
    ログイン後にコピー

あるいは、@Jarod42 が提案しているように、初期化子リストを指定することもできます基本クラスの場合は明示的に:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>
ログイン後にコピー

これにより、指定された初期化子を使用して、直接の基本クラスのメンバーと派生クラスのメンバーの両方を初期化できます。

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

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