这篇文章是否正确"在参考"中传递shared_ptr?

时间:2016-05-22 02:44:49

标签: c++ smart-pointers

有人提出问题"我应该通过引用传递shared_ptr"他得到了这个有很多赞成票的回复。 https://stackoverflow.com/a/8385731/5543597

这让我想知道为什么他有这么多的赞成,如果他说的是真的话:

  

这取决于你想要什么。被叫方应该共享所有权吗?   物体?然后它需要自己的shared_ptr副本。通过它   按价值。

     

如果函数只需要访问调用者拥有的对象,那就去吧   提前并传递(const)引用,以避免复制的开销   shared_ptr。

     

C ++中的最佳实践始终是明确定义所有权   对象的语义。没有普遍的"总是这样做"至   取代实际的想法。

     

如果你总是按值传递共享指针,那么代价很高(因为   复制它们比原始指针贵很多。如果你没有   要做到这一点,那么在第一个中使用共享指针是没有意义的   的地方。

     

在新功能或对象需要共享时复制共享指针   指导者的所有权。

特别是在这里:

  

被叫方是否应共享对象的所有权?然后它需要它自己的   shared_ptr的副本。所以按值传递它。

为什么通过传递值来创建shared_ptr的副本,当它可以被引用时,被调用者可以使用他收到的引用来复制shared_ptr,一旦他决定将其存储在他的数据中?

或者这个:

  

如果你从未这样做过,那么使用共享指针就没有意义了   第一名。

当通过refence将它传递给函数时,它仍然存在于父函数中。一旦决定存储它,就可以毫无问题地存储它。

这些陈述是否正确?

1 个答案:

答案 0 :(得分:2)

是的,答案是正确的。

  

为什么通过传递值来创建shared_ptr的副本,当它可以被引用时,被调用者可以使用他收到的引用来复制shared_ptr,一旦他决定将其存储在他的数据中?

你可以这样做。但是,按值传递可以作为自我文档,被调用者可能会复制。而且,通过值传递的优点是可以用右值调用该函数并将其移出,例如, func( make_shared<T>() );