错误:在此声明unique_ptr(const unique_ptr&)= delete;

时间:2016-03-06 06:14:00

标签: c++ unique-ptr

此代码编译成功。

#include<iostream>
#include<memory>
using namespace std;
class A{
        public:
        unique_ptr<A> myval;
        A(){ cout<<"Constrcutor of A is called"<<endl; }
        ~A(){cout<<"Destructor of A is called"<<endl;}
        unique_ptr<A> getsomething()
        {
                unique_ptr<A> myval;
                myval.reset(new A);
                return myval;
        }
};

但是当我评论本地unique_ptr<A> myval;编译器时会抛出错误。

shared_test.cpp: In member function ‘std::unique_ptr<A> A::getsomething()’:
shared_test.cpp:12:10: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete<A>]’
   return myval;
          ^
In file included from /usr/include/c++/4.8/memory:81:0,
                 from shared_test.cpp:2:
/usr/include/c++/4.8/bits/unique_ptr.h:273:7: error: declared here
       unique_ptr(const unique_ptr&) = delete;
       ^

我无法理解这个错误说的是什么。它是什么?

2 个答案:

答案 0 :(得分:3)

您的本地变量myval正在隐藏班级成员myval

  

当满足复制操作的省略标准并且要复制的对象由左值指定时,首先执行重载的解决方案以选择复制的构造函数,就好像该对象由右值指定

在第一种情况下,返回的对象是使用myval创建的,就好像它是rvalue一样,因为它是rvalue,所以它是允许的选择move构造函数,如果有的话。

在第二种情况下,必须创建一个副本,以便它直接调用copy构造函数,因为unique_ptr对象无法复制而失败,并且您还没有使用{{1确保编译器调用std::move构造函数。

答案 1 :(得分:1)

这意味着无法复制std::unique_ptr

让您的退货声明移动所有权,

return std::move(myval);

或返回原始std::unique_ptr的引用/指针,虽然这不会转移所有权,很可能不是您想要的。

要了解原始OP代码的工作原理,请参阅Returning unique_ptr from functions

编辑:我认为你的原始身体是这样的:

// ..
unique_ptr<A> getsomething()
        {
                return myval;
        }

来自你原来的问题。