这是严格的理论问题.当项目基于智能指针时,几乎所有类都使用它们来包装它们的指针成员,将普通指针传递给成员/非成员函数是不好的做法?我的意思是,拥有成员函数是否正确:
void Function(SomeClass* pSomeClass);
或者它应该始终是:
void Function(std::shared_ptrpSomeClass);
如果传递const引用有任何重要后果(标准const特性除外),我也会徘徊:
void Function(const std::shared_ptr& pSomeClass)
当类std::unique_ptr
用于保护其成员时的情况如何,例如,在类私有成员函数中使用指向其成员的指针?它应该包裹吗?或者它应该被视为设计错误?
如果函数只需要指向对象并且它必须始终是有效对象,而不是null,则通过引用传递对象(const或非const,具体取决于通常的规则).
如果函数只需要指向对象,或者可选地为null,则按原始指针传递(按常规规则传递给const或非const).
如果函数需要共享指向对象的所有权,则传递shared_ptr
by值.
如果函数需要修改shared_ptr
对象的句柄(例如reset
),则传递shared_ptr
非const引用.
如果函数需要访问shared_ptr
句柄上的信息(如use_count
),但不应修改shared_ptr
,则传递shared_ptr
by const引用.
我认为Herb Sutter对此有一些很好的答案.有一个关于智能指针使用的GotW,以及 他最近的演示文稿,他在其中介绍了这一点.新的C++核心指南有一个关于智能指针使用的完整部分.
简而言之,这一切都归结为"将智能指针作为参数仅用于明确表达生命周期语义".如果你传递一个智能指针,这应该意味着你说话/参与所有权,无论是共享还是独特.对于非拥有参数,原始指针或(const)引用是当前的建议.