我有一个关于 c++20 功能之一的问题,指定初始化程序(有关此功能的更多信息here)
#include <iostream>
constexpr unsigned DEFAULT_SALARY {10000};
struct Person
{
std::string name{};
std::string surname{};
unsigned age{};
};
struct Employee : Person
{
unsigned salary{DEFAULT_SALARY};
};
int main()
{
std::cout << std::boolalpha << std::is_aggregate_v<Person> << '\n'; // true is printed
std::cout << std::boolalpha << std::is_aggregate_v<Employee> << '\n'; // true is printed
Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // it's ok
Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // doesn't compile, WHY ?
// For e2 compiler prints a warning "missing initializer for member 'Employee::<anonymous>' [-Wmissing-field-initializers]"
Employee e2 {.salary{55000}};
}
该代码是用 gcc 9.2.0 编译的-Wall -Wextra -std=gnu++2a
flags.
正如你在上面看到的,两个结构,Person
and Employee
是聚合但初始化Employee
使用指定的初始值设定项不可能进行聚合。
有人可以解释一下为什么吗?
根据 C++ 20 标准(9.3.1 聚合。第 #3 页)
(3.1) — 如果初始化列表是指定初始化列表,则
骨料应属于类别类型,每个指示符中的标识符
应命名类的直接非静态数据成员,以及
聚合的显式初始化元素是
是或包含这些成员。
因此,您不能使用指定的初始值设定项列表来初始化基类的数据成员。
使用通常的列表初始化,例如
Employee e1{ "John", "Wick", 40, 50000 };
or
Employee e1{ { "John", "Wick", 40 }, 50000 };
or as @Jarod42指出您可以写的评论
Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
在这种情况下,直接基类由指定的初始化器列表初始化,而整个类 Employe 由非指定的初始化器列表初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)