考虑以下类原型:
class ObjHandler {
std::unique_ptr<Obj> GetPtr() { return obj; }
private:
std::unique_ptr<Obj> obj;
};
这会生成编译时错误,表示已删除std::unique_ptr
的复制构造函数。为什么这里移动语义不适用?它与GetPtr()
不拥有obj
指针的事实有关吗?我应该如何实现我的代码(我需要一个成员函数,以最小的开销返回一个拥有指向流的指针)?
答案 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也有一个暗示:原始指针是定义指示对象不属于的事实。