可以在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个改变为聚集更多详细信息,请参阅我的答案在这里。


以上是可以在C++17中编译,但不能在C++20中编译的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>