首页 > 后端开发 > C++ > 为什么我无法在 C 20 中使用指定的初始化器来初始化派生类成员?

为什么我无法在 C 20 中使用指定的初始化器来初始化派生类成员?

Barbara Streisand
发布: 2024-10-29 14:44:02
原创
446 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板