每周技巧 #188:小心智能指针函数参数
本节阅读量:本文翻译自 Abseil 官网的 Tip of the Week #188: Be Careful With Smart-Pointer Function Parameters。
原文最初作为 TotW #188 发布于 2020 年 12 月 10 日。
更新于 2020 年 12 月 10 日。
快捷链接:abseil.io/tips/188
下面这段代码有什么问题?
|
|
函数 CanYouPetTheDog 并不影响 dog 参数的所有权,但它的签名要求 dog 必须存储在 std::shared_ptr 中。这造成了对特定所有权模型的不必要依赖,尽管函数中没有任何东西需要它。这种依赖会阻止调用者使用其他模型,例如 std::unique_ptr,或者在栈上构造对象。
所有权不受影响时使用引用或指针
通过使用引用,我们可以移除对特定所有权模型的依赖,并让函数可用于任何 Dog 类型对象。
|
|
有了上面的定义,无论调用者使用什么所有权模型,都可以调用这个函数:
|
|
如果函数会修改传入的值,请传递可变引用或原始指针,并使用与上面相同的惯用法。
函数修改所有权时使用智能指针
下面代码为不同智能指针参数提供了几个重载。第一个重载接管传入对象的所有权,第二个重载为传入对象添加共享引用。这两个操作都依赖调用者如何处理 Dog 的所有权。收养一个活在栈上的 Dog 是不可能的,因为不能从栈上拿走所有权。
|
|
结论
如果所有权没有被转移或修改,请避免把智能指针作为函数参数。
相关阅读
本节目录