- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 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
编译的旗帜。
正如您在上面看到的,两个结构 Person
和Employee
是聚合,但初始化 Employee
使用指定的初始值设定项不可能进行聚合。
有人可以解释一下为什么吗?
最佳答案
根据 C++ 20 标准(9.3.1 聚合。第 #3 页)
(3.1) — If the initializer list is a designated-initializer-list, the aggregate shall be of class type, the identifier in each designator shall name a direct non-static data member of the class, and the explicitly initialized elements of the aggregate are the elements that are, or contain, those members.
因此您不能使用指定的初始化器列表来初始化基类的数据成员。
使用通常的列表初始化,例如
Employee e1{ "John", "Wick", 40, 50000 };
或
Employee e1{ { "John", "Wick", 40 }, 50000 };
或者正如@Jarod42在评论中指出的那样,您可以编写
Employee e1{ { .name{"John"}, .surname{"Wick"}, .age{40} }, 50000 };
在这种情况下,直接基类由指定的初始化器列表初始化,而整个类 Employe 由非指定的初始化器列表初始化。
关于c++ - C++20 中的指定初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58876020/
我想成为 Spark 纱客户(link)。是否需要安装hadoop?还是只安装 yarn 可以吗? (by this link) 最佳答案 No Spark不需要Hadoop即可运行。 Apache
我是一名优秀的程序员,十分优秀!