结构体构造函数与聚合类型互斥?代码返回语句解析
聚合类型与特殊初始化写法的疑问解析
先看你给出的代码:
#include <iostream> #include <string> #include <optional> struct Aggregate { int age; std::string name; }; std::optional<Aggregate> MakeOne() { return Aggregate({.name = "Abc"}); }; int main() { auto person = MakeOne(); std::cout << "Age: " << person.value().age << std::endl; return 0; }
你疑惑的Aggregate({.name = "Abc"})并不是调用构造函数,而是C++20引入的聚合体指定初始化语法,本质还是聚合初始化,和聚合类型不能有构造函数的规则完全不冲突——你的Aggregate确实是标准定义的聚合类型。
关键细节说明:
- 聚合类型的判定:
Aggregate结构体没有用户声明的构造函数、私有/保护非静态成员、基类或虚函数,完全符合C++聚合体的定义,所以它是聚合类型。 - 指定初始化器的功能:
{.name = "Abc"}是C++20新增语法,允许精准初始化聚合体的特定成员,未被指定的成员会自动执行值初始化:比如代码里的age是int,会被初始化为0;类类型成员(如std::string)则会默认初始化。 - 该写法的本质:
Aggregate({.name = "Abc"})是显式创建聚合体实例的语法,等价于Aggregate{.name = "Abc"},属于聚合初始化的变体。因为聚合体没有用户定义的构造函数,这里的括号并不是构造函数调用,只是C++允许的聚合初始化语法形式。
运行代码时,age的输出为0,正好验证了未指定成员的初始化规则;name则被正确设置为"Abc"。
内容的提问来源于stack exchange,提问作者Rustam A.
相关产品推荐
相关产品推荐

