如何在建構函式和函式中處理 unique_ptr參數
場景
考慮一個類別將自身引用為如下:
class Base { public: typedef unique_ptr<Base> UPtr; Base() {} Base(Base::UPtr n) : next(std::move(n)) {} virtual ~Base() {} void setNext(Base::UPtr n) { next = std::move(n); } protected: Base::UPtr next; };
傳遞unique_ptr 參數的方法
1.按值(A)
Base(std::unique_ptr<Base> n) : next(std::move(n)) {}當作為Base newBase(std::move(nextBase)); 呼叫時,此方法將指標的所有權轉移給函數。建置完成後,nextBase 變為空。
2.透過非常量左值引用(B)
Base(std::unique_ptr<Base> &n) : next(std::move(n)) {}這需要一個實際的左值(命名變數)並允許函數潛在地宣告指標的所有權。
3。透過 const 左值引用 (C)
Base(std::unique_ptr<Base> const &n);這可以防止函數儲存指針,但保證在執行期間存取該物件。
4。以右值參考 (D)
Base(std::unique_ptr<Base> &&n) : next(std::move(n)) {}與 (B) 類似,但在傳遞非暫時參數時需要使用 std::move。該函數可能會也可能不會聲明所有權。
建議
方法(C)
推薦用於僅使用unique_ptr 的持續時間。 方法 (D) 應避免,因為它在所有權轉移方面不明確。 操作 unique_ptr要移動 unique_ptr,請使用 std::move。這可以避免複製並確保所有權的正確轉移。以上是'unique_ptr”參數應該如何在 C 建構函式和函式中傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!