Visual Studio 2015 报告 C2280:探索“删除的复制构造函数”问题
在 Visual Studio 2013 中,编译以下代码执行时没有错误:
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
然而,在 Visual Studio 2015 RC 中编译时,编译器会引发错误 C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
错误背后的原因
Visual Studio 2015 的行为与其前身不同。根据 C 标准,如果类定义声明了移动构造函数或移动赋值运算符,则编译器会隐式生成删除的复制构造函数和复制赋值运算符。所提供的代码片段就是这种情况,其中存在移动构造函数。
解决问题
要解决编译错误,需要显式声明副本构造函数和复制赋值运算符默认是必需的:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
通过此修改,编译器将生成所需的复制构造函数和复制赋值运算符,而不将它们标记为已删除。
其他注意事项
如果类定义了移动语义,通常建议还定义移动赋值运算符和析构函数。遵循“五规则”原则有助于确保适当的资源管理。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3