C++20中struct是否存在编译器生成的带参构造函数?
C++20中struct支持括号初始化的原因
你遇到的情况不是因为C20给struct新增了编译器生成的构造函数,而是C20扩展了聚合类型的初始化规则——允许使用圆括号()对聚合类型进行初始化,这和此前的花括号{}初始化效果一致。
- 聚合类型判定:struct默认所有非静态成员都是public,符合C++标准里聚合类型的定义;class默认成员是private,不满足聚合类型的要求(聚合要求所有非静态数据成员为public),因此没法用这种方式初始化。
- 版本差异:C17及更早版本中,聚合类型只能用花括号
{}初始化,不能用圆括号,所以切换到C17或改用class时会出现error: no matching function call to 'Test::Test(int, int)'的错误。 - 例外情况:如果把class的成员显式声明为public,它也会被视为聚合类型,在C++20环境下同样可以用圆括号初始化。
另外要注意:标准C++里void main()不是合法的主函数定义,正确写法是int main(),GCC允许void main()只是编译器扩展,不属于标准行为。
内容的提问来源于stack exchange,提问作者fordcars
相关产品推荐
相关产品推荐

