首頁 > 後端開發 > C++ > 為什麼我無法在 C 20 中使用指定的初始化器來初始化衍生類別成員?

為什麼我無法在 C 20 中使用指定的初始化器來初始化衍生類別成員?

Barbara Streisand
發布: 2024-10-29 14:44:02
原創
471 人瀏覽過

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聚合,第#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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板