首頁 > 後端開發 > C++ > 為什麼我不能使用指定的初始值設定項來初始化 C 20 中的繼承成員?

為什麼我不能使用指定的初始值設定項來初始化 C 20 中的繼承成員?

Barbara Streisand
發布: 2024-10-28 17:13:02
原創
550 人瀏覽過

Why can't I use designated initializers to initialize inherited members 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{DEFAULT_SALARY};
};

int main()
{
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Possible
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Error
    Employee e2{.salary{55000}}; // Warning
}</code>
登入後複製

如程式碼所示,Person 和 Employee 都是聚合。但是,使用指定初始值設定項 (e1) 的 Employee 聚合初始化無法編譯。為什麼會這樣呢?

答案在於C 20 標準,特別是第9.3.1 節聚合,第3.1 點:

「如果初始化器列表是指定初始化器列表,則聚合應為類別類型,每個指示符中的標識符應命名該類別的直接非靜態資料成員,並且聚合的明確初始化元素是那些成員或包含這些成員的元素。能用於初始化目前類別的成員。它們不能用於繼承成員或基底類別成員。這個限制就是為什麼 e1 的初始化無效的原因。

要正確初始化e1,可以使用常用的列表初始化語法:

或者,可以使用指定和非指定初始化器來實現相同的結果:
<code class="cpp">Employee e1{ "John", "Wick", 40, 50000 }; // Works</code>
登入後複製

在這種情況下,直接基底類別(Person)使用指定初始化器清單進行初始化,而整個Employee 類別使用非指定初始化器清單進行初始化初始化器清單。
<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 }; // Also works</code>
登入後複製

整體而言,在使用 C 20 中的類別層次結構時,記住指定初始化器的限制非常重要。透過使用適當的初始化語法,可以有效且準確地初始化基底類別和衍生類別的資料成員.

以上是為什麼我不能使用指定的初始值設定項來初始化 C 20 中的繼承成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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