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聚合,第#3 頁),當使用指定的初始值設定項時,指示符中的每個標識符必須命名類別的直接非靜態資料成員。這意味著基類成員無法使用指定的初始化器進行初始化。
因此,使用指定的初始化器初始化Employee(如e1 的情況)是不正確的,應替換為列表初始化或巢狀初始化,如下所示:
<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中文網其他相關文章!