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中文網其他相關文章!