有人提出问题"我应该通过引用传递shared_ptr"他得到了这个有很多赞成票的回复。 https://stackoverflow.com/a/8385731/5543597
这让我想知道为什么他有这么多的赞成,如果他说的是真的话:
这取决于你想要什么。被叫方应该共享所有权吗? 物体?然后它需要自己的shared_ptr副本。通过它 按价值。
如果函数只需要访问调用者拥有的对象,那就去吧 提前并传递(const)引用,以避免复制的开销 shared_ptr。
C ++中的最佳实践始终是明确定义所有权 对象的语义。没有普遍的"总是这样做"至 取代实际的想法。
如果你总是按值传递共享指针,那么代价很高(因为 复制它们比原始指针贵很多。如果你没有 要做到这一点,那么在第一个中使用共享指针是没有意义的 的地方。
在新功能或对象需要共享时复制共享指针 指导者的所有权。
特别是在这里:
被叫方是否应共享对象的所有权?然后它需要它自己的 shared_ptr的副本。所以按值传递它。
为什么通过传递值来创建shared_ptr的副本,当它可以被引用时,被调用者可以使用他收到的引用来复制shared_ptr,一旦他决定将其存储在他的数据中?
或者这个:
如果你从未这样做过,那么使用共享指针就没有意义了 第一名。
当通过refence将它传递给函数时,它仍然存在于父函数中。一旦决定存储它,就可以毫无问题地存储它。
这些陈述是否正确?
答案 0 :(得分:2)
是的,答案是正确的。
为什么通过传递值来创建shared_ptr的副本,当它可以被引用时,被调用者可以使用他收到的引用来复制shared_ptr,一旦他决定将其存储在他的数据中?
你可以这样做。但是,按值传递可以作为自我文档,被调用者可能会复制。而且,通过值传递的优点是可以用右值调用该函数并将其移出,例如, func( make_shared<T>() );