如何在构造函数和函数中处理 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 参数的方法
要有效使用 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。该函数可能会也可能不会声明所有权。
建议
操作 unique_ptr
要移动 unique_ptr,请使用 std::move。这可以避免复制并确保所有权的正确转移。
以上是'unique_ptr”参数应该如何在 C 构造函数和函数中传递?的详细内容。更多信息请关注PHP中文网其他相关文章!