Return private unique_ptr in public 成员函数

Return private unique_ptr in public member function

考虑以下 class 原型:

class ObjHandler {

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

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

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

Why here move semantics are not applied?

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

您可以使用 std::move:

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

尽管如果这确实是您想要的,我建议为该函数命名,以明确表明所有权正在转移(即 this->obj 变为空),例如MovePtr.

名称 GetPtr 听起来好像它没有修改 this->obj 而只是 returns 指向托管对象的非拥有指针,即其行为如下:

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

unique 实际上意味着 'unique ownership'。创建所有权的副本是没有意义的,因为那样它就不再是唯一的了。

您可能想要返回一个 reference 到包含的对象,或者一个 non owning pointer:

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

This post 是一篇关于 what/where/why 使用智能指针的精彩演讲。

并且 CppCoreGuidelines 对此也有提示:根据定义,原始指针指示对象不被拥有的事实。