首页 >后端开发 >C++ >可以使用指定的初始化程序来初始化 C 20 中的基类成员吗?

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-29 19:06:30687浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn