此代码编译成功。
#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;
^
我无法理解这个错误说的是什么。它是什么?
答案 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;
}
来自你原来的问题。