【问题标题】:Should/Can smart pointers be passed by reference in functions应该/可以在函数中通过引用传递智能指针
【发布时间】:2016-04-06 08:45:37
【问题描述】:

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

即:

void foo(const std::weak_ptr<bar>& x)

【问题讨论】:

  • 可以很容易找到,请问您为什么认为它不应该?
  • @5gon12eder:差不多,但没有 cookie。这是可以/应该,就是这样。
  • @Deduplicator 我认为Nicol Bolas's answer 很好地解释了“应该”部分。不是吗? “罐头”部分可能是一个不同的故事,但话又说回来,它与任何其他类型的答案相同。
  • @5gon12eder:好吧,如果所有权转让确实不是有意的,我不明白它是如何解决这个问题的。不过,对于这个问题,这是一个很好的答案。

标签: c++ c++11 smart-pointers


【解决方案1】:

当然你可以通过const&amp;传递一个智能指针。

这样做也是有原因的:
如果接受所述智能指针的函数只是一个接受原始(观察)指针以操作(潜在)指针对象的前面。
永远不要强迫任何人使用智能指针进行传输/共享之外的任何事情所有权,他们可能不会用你坚持的人来管理它。

在所有其他情况下,使用智能指针意味着所有权的转移/共享,并避免廉价复制(只是测试它是否拥有任何东西和引用计数,以及两个指针副本)实际上并没有给你买任何东西。

【讨论】:

  • 澄清一下:写unshared_ptr 很容易(假装是某个东西的共享ptr,但实际上是谎言),就像包装一个不同的智能指针一样。问题是,通过采用特定的语义,你暗示使用它们,完全遵守语义是不可能的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 2019-09-16
    • 1970-01-01
    • 2012-07-14
    • 2020-07-01
    • 1970-01-01
    • 2017-11-12
    • 2012-09-13
    相关资源
    最近更新 更多