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