"错误:使用已删除的功能"在移动构造函数

时间:2017-03-06 09:16:14

标签: c++ c++11 move

#include <memory>

class A
{
public:
    A()
    {
    }

    A( const A&& rhs )
    {
        a = std::move( rhs.a );
    }

private:
    std::unique_ptr<int> a;
};

此代码无法使用g ++ 4.8.4进行编译,并引发以下错误:

error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>
::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_de
lete<int>]’
     a = std::move( rhs.a );
       ^

我知道unique_ptr的复制构造函数和复制赋值构造函数已被删除且无法调用,但是我想在这里使用std::move我将调用移动赋值构造函数。 The official documentation甚至表明这种类型的任务正在完成。

我的代码中有什么问题我没看到?

2 个答案:

答案 0 :(得分:16)

A( const A&& rhs )
// ^^^^^

删除const - 从对象移动是破坏性的,所以你不能从const对象移动是公平的。

答案 1 :(得分:0)

当我未明确声明移动构造函数副本构造函数时,我也遇到了此错误。

我使用了enter image description here中的示例,但是当我尝试实现移动分配运算符时

A& operator=(A&& other){...}

未同时实现两个

A(const A& o) : s(o.s) { ... } A(A&& o) : s(std::move(o.s)) { }

尝试使用移动分配时对std :: move的调用未编译,并且出现了确切的错误。