虽然我花了一段时间才习惯它,但我现在养成了让我的函数通过左值引用const
而不是值来获取共享指针参数的习惯(当然,除非我需要修改原始参数,在这种情况下我通过对非的左值引用来获取它们const
):
void foo(std::shared_ptr<widget> const& pWidget)
// ^^^^^^
{
// work with pWidget...
}
这样做的好处是避免了不必要的共享指针副本,这意味着线程安全地增加了引用计数并可能导致不希望的开销。
现在我一直在想,采用某种对称的习惯来检索函数返回的共享指针是否明智,就像在以下代码片段的末尾一样:
struct X
{
// ...
std::shared_ptr<Widget> bar() const
{
// ...
return pWidget;
}
// ...
std::shared_ptr<Widget> pWidget;
};
// ...
// X x;
std::share_ptr<Widget> const& pWidget = x.bar();
// ^^^^^^
采用这种编码习惯有什么陷阱吗?一般来说,我有什么理由更喜欢将返回的共享指针分配给另一个共享指针对象而不是将其绑定到引用?