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中文网其他相关文章!