shared_ptr<T>&&作为构造函数参数的目的
Purpose of shared_ptr<T>&& as constructor argument
这个问题扩展了之前讨论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是否有移动构造函数,但也许它确实如此。 这意味着移动总是意味着:接收实体可以接管提供的变量,可能会破坏它。
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?