在类定义

时间:2015-05-05 18:16:11

标签: c++ memory-management memory-leaks

如何解释下面的编译错误?

#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 =以及如何正确实现以避免此类问题?

1 个答案:

答案 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)将有效。