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 对此也有提示:根据定义,原始指针指示对象不被拥有的事实。
考虑以下 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 对此也有提示:根据定义,原始指针指示对象不被拥有的事实。