shared_ptr<T>&&作为构造函数参数的目的

Purpose of shared_ptr<T>&& as constructor argument

本文关键字:构造函数 参数 ptr lt shared gt      更新时间:2023-10-16

这个问题扩展了之前讨论boost::shared<T>&作为构造函数参数的有用性的文章:

class SomeClass {  
    SomeClass( const boost::shared_ptr<SomeOtherClass>& );  
} 

用右值引用参数代替boost::shared_ptr<T>&会有什么好处吗?

class SomeClass {  
    SomeClass( const boost::shared_ptr<SomeOtherClass>&& );  
}    

特别是,对于多线程设置,具有shared_ptr类型的右值引用的构造函数是否比按值传递或按引用传递更有用?

shared_ptr并不特别。 相同的规则适用于它,就像适用于几乎任何其他对象一样。 你会做一个常量右值引用参数吗? 我看不出任何正当理由。 其他类的右值引用呢? 除了在类自己的移动构造函数和移动赋值运算符中,在大多数情况下,您不应该通过右值引用获取对象。 如果您需要对象的副本,则按值将其接收并移动,如下所示:

class SomeClass {
    std::shared_ptr<SomeOtherClass> myptr;
public:
    SomeClass(std::shared_ptr<SomeOtherClass> yourptr)
        :myptr(std::move(yourptr))
    {}
};

如果你不需要副本,那么如果你的意图只是检查它,你可以通过 const 引用来获取它,或者如果你打算修改它,你可以通过普通引用来获取它。

如果你想承诺你不会修改指向的对象,那么你可以接受const std::shared_ptr<const SomeOtherClass> &,即使参数没有内部 const 限定符,这也将起作用。

const 右值没有任何意义。但是,按右值获取可以更快地转让所有权,因为只需要交换。

我不确定是否有任何常量右值引用这样的东西,我不知道这意味着什么。 当它到达函数并有一个名称时,它基本上与 const lvalue 引用相同(如果它有一个名称,那就是规则的左值)。 您将不被允许移动它。

我不确定这在呼叫站点意味着什么...如果有的话。 当然,它只能使人们感到困惑,因此简直是坏事。

坦率地说,如果编译它,我会有点恼火。 我不能说这是非法的。

现在,摆脱常量部分,你有一个不同的故事。 现在您可以"移动"shared_ptr。 我宁愿怀疑shared_ptr是否有移动构造函数,但也许它确实如此。 这意味着移动总是意味着:接收实体可以接管提供的变量,可能会破坏它。