Visual Studio 2015 中编译器错误 C2280“尝试引用已删除的函数”
Visual Studio 2015 编译器与其 2013 的前身不同,自动为定义移动构造函数或移动赋值运算符的类生成删除的复制构造函数。 C 标准强制执行此行为,以防止在首选移动的情况下发生意外复制。
在您的代码片段中,类 A 有一个移动构造函数 A(A &&),这又意味着删除的副本构造函数按照标准。因此,main 中的新 A(a) 表达式会触发错误 C2280。
要解决此问题,您可以在 A 中显式声明复制构造函数:
class A {
public:
A() {}
A(A &&) {}
A(const A&) = default; // Explicitly declare the copy constructor as defaulted
};
或者,如果您确实打算禁用复制而只允许移动,则可以将复制构造函数和复制赋值运算符声明为已删除:
class A {
public:
A() {}
A(A &&) {}
A(const A&) = delete;
A& operator=(const A&) = delete; // Delete copy assignment operator
};
请记住,如果您选择禁用复制,您还需要声明移动赋值运算符和析构函数以符合五法则。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3