考虑以下类原型:
class ObjHandler {
std::unique_ptr<Obj> GetPtr() { return obj; }
private:
std::unique_ptr<Obj> obj;
};
这会生成一个编译时错误,提示std::unique_ptr
的复制构造函数已被删除。为什么这里没有应用移动语义?这是否与GetPtr()
不拥有obj
指针有关?我该如何实现我的代码(我需要一个成员函数,以最小开销返回拥有流的指针)?
考虑以下类原型:
class ObjHandler {
std::unique_ptr<Obj> GetPtr() { return obj; }
private:
std::unique_ptr<Obj> obj;
};
这会生成一个编译时错误,提示std::unique_ptr
的复制构造函数已被删除。为什么这里没有应用移动语义?这是否与GetPtr()
不拥有obj
指针有关?我该如何实现我的代码(我需要一个成员函数,以最小开销返回拥有流的指针)?
unique
实际上意味着“独占所有权”。创建所有权的副本毫无意义,因为那样它就不再是唯一的了。
你可能想要返回所包含对象的引用或者一个非拥有指针:
class ObjHandler {
Object &get(){ return *obj; }
Object *GetPtr() { return obj.get(); }
private:
unique_ptr<Object> obj;
};
这篇文章是有关使用智能指针的何时/何地/为什么的非常好的讲解。
而CppCoreGuidelines也提到了这一点:原始指针在定义上表明对象不是所有者。
为什么这里没有使用移动语义?
因为obj
不是一个局部变量,所以语言不允许隐式移动它。
您可以使用std::move
来移动它:
std::unique_ptr<Obj> GetPtr() { return std::move(obj); }
this->obj
变为null)的名称,例如MovePtr
。
GetPtr
的名称听起来像它不修改this->obj
,只返回一个非所有指向受管理的对象的指针,即其行为如下:Obj* GetPtr() const { return obj.get(); }
GetPtr()
时会发生什么的内容。 - Bo Persson