移动 std::shared_ptr 的函数声明

Function declaration for moving std::shared_ptr

对于按值传递共享指针还是按引用传递共享指针,几乎没有好的答案。但是,我没有找到关于 'moving' 共享指针的最佳实践的答案。

我的函数有一个指向对象的共享指针,但它不想保留。据我了解,移动它是性能方面的最佳选择,因为我们可以跳过增加然后立即减少引用计数的步骤。但是,我不清楚这两个声明之间是否存在差异:

调用函数

foo(std::move(sourcePtr));

声明应该是

选项 1

void foo(std::shared_ptr<X> x);

或选项 2

void foo(std::shared_ptr<X>&& x);

值得注意的是,std::move实际上并没有对对象执行move,它只是将对象转换为右值(xvalue)。

那么对于第一种情况,参数x将从sourcePtr移动构造。之后 sourcePtr 的托管指针将为空。

对于第二种情况,没有std::shared_ptr被构造; x 是一个右值引用并绑定到 sourcePtr。那么会发生什么取决于 foo() 的实现,并且 sourcePtr 不会被移动,直到你通过 xfoo() 中执行它,例如std::shared_ptr<X> new_x = std::move(x);.