首页 > 后端开发 > C++ > 正文

可以使用指定的初始化程序来初始化 C 20 中的基类成员吗?

Mary-Kate Olsen
发布: 2024-10-29 19:06:30
原创
627 人浏览过

 Can Designated Initializers be Used to Initialize Base Class 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()
{
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile
    Employee e2 {.salary{55000}}; // warning: missing initializer for base class member
}</code>
登录后复制

代码无法编译 e1,因为指定的初始化器只能用于初始化直接派生类的非静态成员。换句话说,您无法直接使用指定的初始化器来初始化基类的成员。

要解决此问题,您可以使用以下方法:

  • 传统列表初始化:

    <code class="cpp">Employee e1{ "John", "Wick", 40, 50000 };</code>
    登录后复制
  • 嵌套指定初始化列表:

    <code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };</code>
    登录后复制

或者,按照@Jarod42的建议,您也可以指定初始化列表显式用于基类:

<code class="cpp">Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, .salary{50000} };</code>
登录后复制

这允许您使用指定的初始化器来初始化直接基类成员和派生类成员。

以上是可以使用指定的初始化程序来初始化 C 20 中的基类成员吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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