C++ 共享_ptr&&as构造函数参数的用途

C++ 共享_ptr&&as构造函数参数的用途,c++,constructor,c++11,shared-ptr,rvalue-reference,C++,Constructor,C++11,Shared Ptr,Rvalue Reference,这个问题扩展了之前讨论boost::shared&作为构造函数参数的有用性的讨论: class SomeClass { SomeClass( const boost::shared_ptr<SomeOtherClass>& ); } 用右值引用参数代替boost::shared\u ptr&会有什么好处吗 class SomeClass { SomeClass( const boost::shared_ptr<SomeOtherClass

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

class SomeClass {  
    SomeClass( const boost::shared_ptr<SomeOtherClass>& );  
} 
用右值引用参数代替boost::shared\u ptr&会有什么好处吗

class SomeClass {  
    SomeClass( const boost::shared_ptr<SomeOtherClass>&& );  
}    
特别是,对于多线程设置,具有共享\u ptr类型的右值引用的构造函数是否比按值传递或按引用传递更有用?

共享\u ptr并不特别。它适用的规则与几乎任何其他对象相同。你会做一个常量值引用参数吗?我看不出任何正当的理由。其他类的右值引用如何?除了类自己的move构造函数和move赋值操作符之外,大多数情况下,您不应该通过右值引用获取对象。如果需要对象的副本,请按值将其接收并移动,如下所示:

class SomeClass {
    std::shared_ptr<SomeOtherClass> myptr;
public:
    SomeClass(std::shared_ptr<SomeOtherClass> yourptr)
        :myptr(std::move(yourptr))
    {}
};
如果您不需要副本,那么您可以通过常量引用(如果您只是想检查它)获取副本,或者通过普通引用(如果您想修改它)获取副本

如果您希望保证不会修改指向的对象,那么您可以接受const std::shared_ptr&,即使参数没有内部const限定符,这也会起作用。

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

class SomeClass {
    std::shared_ptr<SomeOtherClass> myptr;
public:
    SomeClass(std::shared_ptr<SomeOtherClass> yourptr)
        :myptr(std::move(yourptr))
    {}
};
如果您不需要副本,那么您可以通过常量引用(如果您只是想检查它)获取副本,或者通过普通引用(如果您想修改它)获取副本


如果您希望保证不会修改指向的对象,那么您可以接受const std::shared_ptr&,即使参数没有内部const限定符,这也会起作用。

常量值没有任何用途。但是通过右值获取可以更快地转移所有权,因为只有交换是必要的。

保持右值没有任何意义。但是通过右值获取可以更快地转移所有权,因为只有交换是必要的。

我不确定是否存在常量右值引用,我不知道这意味着什么。当它到达函数并有一个名称时,它本质上与常量左值引用相同,如果它有一个名称,那么它就是一个左值,这就是规则。你不能移动它

我不知道这在呼叫现场意味着什么…如果有的话。当然,这只会把人们搞糊涂,所以这是很糟糕的

坦白地说,如果那样的话,我会有点恼火。但我不能说这是违法的


现在,去掉const部分,你就有了一个不同的故事。现在您可以移动共享的\u ptr。我很怀疑shared_ptr是否有移动构造函数,但也许有。这意味着移动总是意味着什么:接收实体可能会接管提供的变量,可能会破坏它。

我不确定是否存在常量值引用,我不知道这意味着什么。当它到达函数并有一个名称时,它本质上与常量左值引用相同,如果它有一个名称,那么它就是一个左值,这就是规则。你不能移动它

我不知道这在呼叫现场意味着什么…如果有的话。当然,这只会把人们搞糊涂,所以这是很糟糕的

坦白地说,如果那样的话,我会有点恼火。但我不能说这是违法的


现在,去掉const部分,你就有了一个不同的故事。现在您可以移动共享的\u ptr。我很怀疑shared_ptr是否有移动构造函数,但也许有。这意味着移动总是意味着什么:接收实体可能会接管提供的变量,可能会将其销毁。

如果使用右值引用,则可以将共享的ptr移动到内部成员中,而不是复制它。复制共享的_ptr会导致它增加其引用计数,这比人们最初想象的要贵得多。请注意,复制共享\u ptr是线程安全的,而移动共享\u ptr则不是。如果使用右值引用,则可以将共享\u ptr移动到内部成员中,而不是复制它。复制共享的_ptr会导致它增加其引用计数,这比人们最初想象的要贵得多。请注意,复制共享的\u ptr是线程安全的,而移动共享的\u ptr则不是。如果您想强调您拥有某些东西,我认为右值ref参数是完全可以接受的。@Xeo:如果您按值获取参数并移动它,那么您就拥有了它。如果您想强调您拥有某些东西,我
认为右值引用参数是完全可以接受的。@Xeo:如果你按值获取参数并移动它,那么你就是在获取它的所有权。有一个常量右值引用,但它是非常无用的。有一个常量右值引用,但它是非常无用的。