函数中的智能指针

Smart pointers in functions

这是严格意义上的理论问题。 当项目基于智能指针时,几乎所有 classes 都使用它们来包装它们的指针成员,将普通指针传递给 member/not 成员函数是一种不好的做法吗? 我的意思是,拥有像这样的成员函数是否正确:

void Function(SomeClass* pSomeClass);

或者应该始终是:

void Function(std::shared_ptr<SomeClass> pSomeClass);

我也想知道传递 const 引用是否有任何重要后果(标准 const 特性除外):

void Function(const std::shared_ptr<SomeClass>& pSomeClass)

当class使用std::unique_ptr来保护其成员时,例如class私有成员函数中使用了指向其成员的指针,情况如何?是不是也要包起来还是应该认为是设计错误?

如果函数只需要指向的对象并且它必须始终是有效对象,而不是空对象,则通过引用传递对象(const 或非常量,取决于按照通常的规则)。

如果函数只需要指向的对象,或者可选的 null,则通过 原始指针(按照通常的规则传递给 const 或非常量)。

如果函数需要共享指向对象的所有权,按值传递shared_ptr

如果函数需要修改对象的shared_ptr句柄(例如reset),通过非常量引用传递shared_ptr.

如果函数需要访问shared_ptr句柄上的信息(如use_count),但不应修改shared_ptr,则传递shared_ptr 通过常量引用.

我认为 Herb Sutter 对此有一些很好的回答。 GotW about smart pointer usage, and a more recent presentation where he covers this. The new C++ Core Guidelines 有一个关于智能指针用法的完整部分。

简而言之,一切都归结为 "Take smart pointers as parameters only to explicitly express lifetime semantics"。如果您传递一个智能指针,这应该意味着您 talk/participate 拥有所有权,无论是共享的还是唯一的。对于非拥有参数,原始指针或 (const) 引用是当前的建议。