C++20中函数返回列表初始化失效,替代方案是否可行?
问题解答
为什么C++20下原代码编译失败
C++20对聚合类的判定规则做了调整:如果类显式声明了任何构造函数(包括被= default显式默认的构造、拷贝构造),或者显式声明了析构函数,那么该类不再被视为聚合类。
原代码中的Test结构体显式默认了默认构造、拷贝构造和析构函数,在C20中不属于聚合类,因此return {1, 2}这种聚合初始化方式不再适用,编译器找不到匹配的构造函数,从而报错。而C17的聚合类判定规则更宽松,允许显式默认这些特殊成员函数,所以原代码在C++17中可以正常编译。
你的解决方案是否正确
添加自定义构造函数Test(int first, int second),并改用return Test(1, 2)的返回方式是完全正确的:
- 这个自定义构造函数能被编译器直接匹配,通过构造函数初始化对象并返回;
- 该写法在C17和C20标准下都能正常编译,兼容性良好。
如果不想添加自定义构造函数,另一种方案是移除所有显式默认的特殊成员函数声明,让Test在C++20中重新成为聚合类,这样return {1, 2}的写法就能恢复正常。
内容的提问来源于stack exchange,提问作者Thinium
相关产品推荐
相关产品推荐

