关于C++20新增自动生成构造函数特性的技术问题问询
解答
对应的C++20新特性
这段代码能在C20下编译通过,依赖的是聚合体圆括号初始化特性,对应C20提案P0960R3。
你定义的Foo是典型的聚合类:没有用户声明的构造函数、所有非静态成员都是public权限、没有基类也没有虚函数。在C17及更早标准中,聚合类只能用花括号{}做列表初始化,不支持用圆括号()传参初始化,所以代码在-std=c++17下编译失败。C20放宽了这个限制,只要圆括号传入的参数数量、顺序、类型和聚合类的成员匹配,就可以直接完成聚合初始化,效果和花括号初始化完全一致。
构造函数相关说明
这个场景下编译器不会自动生成额外的参数化构造函数:
- 聚合初始化的本质是直接按顺序给类的成员赋值,不需要调用构造函数,因此不需要生成匹配
(std::string, int)参数的构造函数。 - 编译器只会为
Foo隐式生成默认构造、拷贝构造、移动构造、析构函数这几类常规的特殊成员函数,这些函数和本次的圆括号初始化逻辑没有关系。
内容的提问来源于stack exchange,提问作者Zizheng Tai
相关产品推荐
相关产品推荐

