我想将共享指针传递给函数。你能帮我吗?
当然可以,我可以为您提供帮助。我假设您对C ++中的所有权语义有所了解。真的吗?
是的,我对这个主题相当满意。
好。
好的,我只能想到两个理由来shared_ptr
争论:
- 该功能希望共享对象的所有权;
- 该函数执行一些专门针对
shared_ptr
s的操作。
您对哪一个感兴趣?
我正在寻找一个一般性的答案,所以我实际上对这两者都感兴趣。不过,我很好奇第二种情况下的意思。
此类函数的示例包括std::static_pointer_cast
,自定义比较器或谓词。例如,如果您需要从向量中查找所有唯一的shared_ptr,则需要这样的谓词。
嗯,当函数实际上需要操纵智能指针本身时。
究竟。
在这种情况下,我认为我们应该通过引用。
是。而且,如果不更改指针,则希望通过const引用传递。无需共享所有权,因此无需复制。那是另一种情况。
好的,我知道了。让我们谈谈另一种情况。
您共享所有权的人?好。您如何与他人共享所有权shared_ptr
?
通过复制。
然后该功能将需要制作一个的副本,对shared_ptr
吗?
明显。所以我通过引用const传递它并将其复制到局部变量?
不,这是一种悲观。如果通过引用传递,则该功能别无选择,只能手动制作副本。如果按值传递,则编译器将在复制和移动之间选择最佳选择并自动执行。因此,传递价值。
好点子。我必须记得更多的文章是“想要速度?通过价值传递”。
等等,例如,如果函数将shared_ptr
变量存储在成员变量中怎么办?那不是多余的副本吗?
该函数可以简单地将shared_ptr
参数移到其存储中。移动ashared_ptr
很便宜,因为它不会更改任何引用计数。
啊,好主意。
但是我在考虑第三种情况:如果您不想操纵shared_ptr
或分享所有权怎么办?
在这种情况下,shared_ptr
与功能完全无关。如果要操纵该pointe,请选择一个pointee,然后让调用者选择他们想要的所有权语义。
我应该以参考还是以价值来衡量尖兵?
通常的规则适用。智能指针不会改变任何东西。
如果要复制,请按值传递,如果要避免复制,则按引用传递。
对。
嗯 我认为您忘记了另一种情况。如果我想共享所有权,但仅取决于特定条件怎么办?
啊,有趣的情况。我不希望这种情况经常发生。但是当发生这种情况时,您可以根据需要传递值并忽略该副本,也可以根据需要传递引用并进行复制。
在第一种选择中,我会冒一个冗余副本的风险,而在第二种选择中,我会失去潜在的举动。我不能吃蛋糕也可以吗?
如果您确实需要这样做,则可以提供两个重载,一个重载为const左值引用,另一个重载为一个右值引用。一个复制,另一个移动。完善转发功能模板是另一种选择。
我认为这涵盖了所有可能的情况。非常感谢你。
const std::shared_ptr<myClass>& arg1