如何解释下面的编译错误?
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class A{
unique_ptr<vector<short>> v;
public:
A(){
v = unique_ptr<vector<short>>(new vector<short>());
cout << "A()" << endl;
}
A(const A& a) : A(){
cout << "A(const A& a)" << endl;
}
};
int main() {
A a1; // prints A()
A a2 = a1; // prints A() then A(const A& a)
A& a3 = a1; // prints nothing
a3 = a1; // compile time error: use of deleted function ‘A& A::operator=(const A&)
return 0;
}
实际上,为什么A& a3 = a1
没问题而a3 = a1
没有?此外,正在使用哪个重载版本的operator =以及如何正确实现以避免此类问题?
答案 0 :(得分:6)
在第
行a3 = a1;
您正在调用已删除的operator=
(请记住unique_ptr
是不可复制的)。 g ++为你吐出错误:
错误:使用已删除的功能&#39; A&amp; A :: operator =(const A&amp;)&#39;
而在
行A& a3 = a1;
没有制作副本,您只需初始化参考。
您可能想要移动指针,例如
a3 = std::move(a1);
不幸的是,由于您显式声明了一个复制构造函数,它不会起作用,这会阻止编译器生成默认的移动构造函数和赋值运算符。解决方案:声明移动赋值运算符并将构造函数移动为=default;
,
A& operator=(A&&) = default;
A(A&&) = default;
并且上面的行a3 = std::move(a1)
将有效。