1.指针的左值引用
std::unique_ptr<...> up(...);
void func(std::unique_ptr<...> &);
.....
func(up);
2.传递指针或引用参数而不是智能指针
若是您的函数与全部权无关,那么这是首选方法:不要使其彻底采用智能指针。
在这种状况下,您的函数无需担忧谁拥有所指向的对象,或担忧全部权的管理方式,所以传递原始指针既安全又是最灵活的形式,由于不管全部权如何,客户均可以始终产生原始指针(经过调用get方法或从运算符&的地址)。
2.1.传递原始指针(调用get方法)
std::unique_ptr<classX> up(...);
void func(classX *<...> );
// 调用
func(up.get());
2.2.传递指针指向对象的引用
std::unique_ptr<classX> up(...);
void func(classX &);
// 调用
func(*up);
3.右值引用,传入std::move后的对象
std::unique_ptr<...> up(...);
void func(std::unique_ptr<...> );
// 调用
func(std::move(up));
4.return一个unique_ptr,也借用std::move(可省略)
std::unique_ptr<...> func()
{
std::unique_ptr<...> up(...);
return up;
}
理论上应该用调用外面加std::move,如下:
std::unique_ptr<..> up = std::move(func());
但是实际上,可以省去move函数,原因是c++11规定,编译器应自动尝试加上move.
https://blog.csdn.net/liji_digital/article/details/116274523
http://www.javashuo.com/article/p-dcrzsmky-gw.html
另外,注意:
智能指针转普通指针问题