2

这个问题扩展了上一篇讨论作为构造函数参数 的有用性的帖子: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 类型的右值引用的构造函数是否比按值传递或按引用传递更有用?

4

3 回答 3

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 限定符,它也可以工作。

于 2012-05-05T03:34:32.410 回答
1

const右值没有目的。但是通过右值获取可以更快地转移所有权,因为只需要交换。

于 2012-05-05T03:42:07.293 回答
0

我不确定是否存在 const rvalue 引用之类的东西,我也不知道它是什么意思。当它到达函数并有了名称时,它与 const 左值引用基本相同(如果它有名称,则左值就是规则)。你不会被允许移动它。

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

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

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

于 2012-05-05T22:19:00.767 回答