此问题延伸了前一个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引用的构造函数是否会比按值传递或按引用传递更有用?
答案 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有一个移动构造函数,但也许它确实如此。这意味着移动总是意味着:接收实体可以接管提供的变量,可能会破坏它。