【发布时间】:2015-09-24 17:30:26
【问题描述】:
此 sn-p 在 Visual Studio 2013(版本 12.0.31101.00 更新 4)中编译时没有错误
class A
{
public:
A(){}
A(A &&){}
};
int main(int, char*)
{
A a;
new A(a);
return 0;
}
在 Visual Studio 2015 RC(版本 14.0.22823.1 D14REL)中编译时出现此错误:
1>------ Build started: Project: foo, Configuration: Debug Win32 ------
1> foo.cpp
1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)': attempting to reference a deleted function
1> c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我认为 Visual Studio 2015 附带的编译器会生成复制构造函数并将其标记为 =delete,因此我收到错误 C2280(顺便说一句,我在 msdn.microsoft.com 上找不到文档)。
现在,假设我有一个可与 Visual Studio 2013 编译的代码库(它可以工作,因为它依赖于编译器自动生成的代码)但由于 C2280 而不能与 Visual Studio 2015 编译,我该如何修复有问题吗?
我正在考虑以这种方式声明类A:
class A
{
public:
A(){}
A(A &&){}
A(const A&)=default;
};
我错过了什么吗?
【问题讨论】:
-
还有
A& operator=(A&&) ;和A& operator=(const A&); -
在我的例子中,我的类中有一个 std::unique_ptr 阻止编译器生成隐式复制构造函数。
标签: c++ visual-c++ copy-constructor c++14