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 サイトの他の関連記事を参照してください。