”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Visual Studio 2015 在编译移动构造函数代码时报告错误 C2280“已删除复制构造函数”?

为什么 Visual Studio 2015 在编译移动构造函数代码时报告错误 C2280“已删除复制构造函数”?

发布于2024-11-17
浏览:452

Why Does Visual Studio 2015 Report Error C2280 \

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