可以在C++17中编译,但不能在C++20中编译
我有一个非常简单的代码示例。我可以在 C++17 中编译它,但不能在 C++20 中编译它。为什么不?
struct S
{
S(const S&) = delete;
S( S&& ) = default;
int k;
int m;
int n;
};
int main()
{
S s1{10, 20, 30};
return s1.m;
}
回答
这是因为P1008改变了从
没有用户提供的、显式的或继承的构造函数
到
没有用户声明或继承的构造函数
您的构造函数是用户声明的,但不是用户提供的(您声明它们,因此它们是用户声明的,但它们在初始声明时是默认的,因此您没有为它们提供定义)。在 C++17 中,S是一个聚合。但在 C++20 中,它不是。因此,不再有聚合初始化,因此S{10, 20, 30}只能调用构造函数 - 其中没有可行的构造函数。
如果你想让它继续工作,你必须提供一个构造函数。
关于C ++ 20个改变为聚集更多详细信息,请参阅我的答案在这里。