簡體   English   中英

在公共成員函數中返回private unique_ptr

[英]Return private unique_ptr in public member function

考慮以下類原型:

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(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM