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

C 20 で指定された初期化子を使用して派生クラスのメンバーを初期化できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 14:44:02446ブラウズ

Why Can't I Initialize Derived Class Members Using Designated Initializers 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{10000};
};

int main() {
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile
    Employee e2{.salary{55000}}; // Warning: missing initializer for base class
}</code>

指定されたイニシャライザによる Employee の初期化が失敗し、イニシャライザが見つからないという警告が生成されるのはなぜですか?

答え:

C 20 標準 (9.3.1) による集合体、p. #3)、指定された初期化子を使用する場合、指定子の各識別子はクラスの直接の非静的データ メンバーを指定する必要があります。これは、指定されたイニシャライザを使用して基本クラスのメンバーを初期化できないことを意味します。

したがって、e1 の場合のように、指定されたイニシャライザを使用して Employee を初期化することは誤りであり、次のようにリスト初期化またはネストされた初期化のいずれかに置き換える必要があります。

<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization
Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization
Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>

最後の例では、ネストされた初期化内の指定された初期化子リストを使用して、基本クラス person が初期化されます。

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

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