shared_ptr的目的<t>&amp;&amp;作为构造函数参数</t>

时间:2012-05-05 03:10:32

标签: c++ constructor c++11 shared-ptr rvalue-reference

此问题延伸了前一个post讨论boost::shared<T>&作为构造函数参数的用处:

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

代替boost::shared_ptr<T>&的右值引用参数是否会提供任何优势?

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

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

3 个答案:

答案 0 :(得分:4)

shared_ptr并不特别。几乎任何其他对象都适用相同的规则。你会做一个const rvalue参考参数吗?我看不出任何有效的理由。一些其他类的右值引用怎么样?除了在类的自己的移动构造函数和移动赋值运算符中,您应该在大多数情况下不通过右值引用来获取对象。如果你需要一个对象的副本,那么你可以按值获取它,并移动它,如下所示:

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限定符,这也会有效。

答案 1 :(得分:1)

const rvalue没有任何意义。但是,通过rvalue可以实现更快的所有权转移,因为只需要交换。

答案 2 :(得分:0)

我不确定是否存在const rvalue引用这样的东西,我不知道它意味着什么。当它到达函数并且有一个名称时,它将与const左值引用基本相同(如果它有一个名称,则它是一个左值是规则)。你不会被允许移动它。

我不确定它在呼叫网站上意味着什么......如果有的话。当然,这只能让人们迷惑不解,所以简直就是坏事。

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

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