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>
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>
巢狀>
巢狀指定初始化清單:或者,依照@Jarod42的建議,您也可以指定初始化清單明確用於基底類別:這允許您使用指定的初始化器來初始化直接基底類別成員和衍生類別成員。以上是可以使用指定的初始化程序來初始化 C 20 中的基底類別成員嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!