在公共成员函数中返回private unique_ptr

时间:2017-03-11 11:49:20

标签: c++ smart-pointers

考虑以下类原型:

class ObjHandler {

    std::unique_ptr<Obj> GetPtr() { return obj; }

  private:
    std::unique_ptr<Obj> obj;
};

这会生成编译时错误,表示已删除std::unique_ptr的复制构造函数。为什么这里移动语义不适用?它与GetPtr()不拥有obj指针的事实有关吗?我应该如何实现我的代码(我需要一个成员函数,以最小的开销返回一个拥有指向流的指针)?

2 个答案:

答案 0 :(得分:7)

  

为什么这里没有应用移动语义?

因为obj不是局部变量,所以语言不允许隐式移动它。

您可以使用std::move

移动它
std::unique_ptr<Obj> GetPtr() { return std::move(obj); }

虽然如果这确实是你想要的,我建议命名这个功能,以明确所有权的转移(即this->obj变为空),例如MovePtr

名称GetPtr听起来好像不修改this->obj,只返回一个指向托管对象的非拥有指针,即其行为如下:

Obj* GetPtr() const { return obj.get(); }

答案 1 :(得分:7)

unique实际上意味着独特的所有权&#39;。没有意义的是你会创建一个所有权的副本,因为它不再是唯一的。

您可能想要的是将引用返回到包含的对象或非拥有指针:

class ObjHandler {
   Object &get(){ return *obj; }
   Object *GetPtr() { return obj.get(); }
private:
   unique_ptr<Object> obj;
};

This post是关于使用智能指针的内容/位置/原因的非常好的讨论。

CppCoreGuidelines也有一个暗示:原始指针是定义指示对象不属于的事实。