这是严格的理论问题。 当项目基于智能指针时,几乎所有类都使用它们来包装它们的指针成员,将普通指针传递给成员/非成员函数是不好的做法? 我的意思是,拥有成员函数是正确的:
void Function(SomeClass* pSomeClass);
或者应该永远是:
void Function(std::shared_ptr<SomeClass> pSomeClass);
如果传递const引用有任何重要后果(标准const特性除外),我也会徘徊:
void Function(const std::shared_ptr<SomeClass>& pSomeClass)
当类使用std::unique_ptr
来保护其成员时的情况怎么样?例如,在类私有成员函数中使用指向其成员的指针?它应该包裹吗?或者它应该被视为设计错误?
答案 0 :(得分:9)
如果函数只需要指向对象并且它必须始终是有效对象,而不是null,则通过引用传递对象(const或非const,具体取决于通常的规则)
如果函数只需要指向对象,或者可选地为null,则通过原始指针(按照通常的规则传递给const或非const)。
如果该功能需要共享指向对象的所有权,请按值>> shared_ptr
传递。
如果函数需要修改对象的shared_ptr
句柄(例如reset
),则通过非const引用传递 shared_ptr
。
如果该功能需要访问shared_ptr
句柄上的信息(例如use_count
),但不应修改shared_ptr
,请传递 shared_ptr
const参考。
答案 1 :(得分:5)
我认为Herb Sutter对此有一些好的答案。有一个关于智能指针使用的GotW,以及a more recent presentation,其中包含了这一点。新的C++ Core Guidelines有一个关于智能指针使用的完整部分。
简而言之,这一切都归结为"Take smart pointers as parameters only to explicitly express lifetime semantics"。如果你传递一个智能指针,这应该意味着你说话/参与所有权,无论是共享还是独特。对于非拥有参数,原始指针或(const)引用是当前的建议。