C++ 智能指针是否应该/可以在函数中通过引用传递

C++ 智能指针是否应该/可以在函数中通过引用传递,c++,c++11,smart-pointers,C++,C++11,Smart Pointers,智能指针是否应该/可以在函数中通过引用传递 即: void foo(const std::weak_ptr&x) 当然,您可以通过常量传递智能指针& 这样做也是有原因的: 如果接受所述智能指针的函数只是接受原始(观察)指针以操作(潜在)指针对象的函数的前端。 切勿强迫任何人使用智能指针进行任何操作,除非转让/共享所有权,否则他们可能无法使用您坚持使用的智能指针进行管理。 在所有其他情况下,使用智能指针意味着所有权的转移/共享,而避免一个便宜的副本(只是测试它是否拥有任何东西和引用计数,以及两个指

智能指针是否应该/可以在函数中通过引用传递

即:

void foo(const std::weak_ptr&x)

当然,您可以通过
常量传递智能指针&

这样做也是有原因的:
如果接受所述智能指针的函数只是接受原始(观察)指针以操作(潜在)指针对象的函数的前端。
切勿强迫任何人使用智能指针进行任何操作,除非转让/共享所有权,否则他们可能无法使用您坚持使用的智能指针进行管理。


在所有其他情况下,使用智能指针意味着所有权的转移/共享,而避免一个便宜的副本(只是测试它是否拥有任何东西和引用计数,以及两个指针副本)实际上不会给你带来任何好处。

不,如果我们谈论的是
std
智能指针
const&
不能转让/分享所有权,所以原始的非所有权
T*
总是更好、更有效。

可以很容易找到,请问您为什么认为它不应该?可能是@5gon12eder的重复:几乎,但没有cookie。这就是can/should,这就是为什么。@Deduplicator我认为很好地解释了“should”部分。你不觉得吗?“可以”部分可能是另一个故事,但同样,它的答案与任何其他类型的答案相同。@5gon12eder:好吧,如果所有权转移真的不是故意的,我看不出它是如何解决这个问题的。不过,对于这个问题,这是一个很好的答案。作为澄清:编写
非共享的ptr
很容易(假装是某个东西的共享ptr,但实际上是谎言),包装不同的智能指针也很容易。问题是,通过使用特定的语义,您就意味着要使用它们,而完全遵守语义是不可能的。
void foo(const std::weak_ptr<bar>& x)