通过右值引用获得形参的所有权
Take ownership of parameter by rvalue-reference
我想明确我的类A
的构造函数将获得传递的Data
参数的所有权。显然,要做的是按值取unique_ptr
:
class A
{
public:
A(std::unique_ptr<Data> data) : _data(std::move(data)) { }
std::unique_ptr<Data> _data;
};
然而,对于我的用例,没有理由为什么Data
应该是一个指针,因为值类型就足够了。我能想到的唯一剩下的选项是通过rvalue-reference:
Data
将被A
拥有。class A
{
public:
A(Data&& data) : _data(std::move(data)) { }
Data _data;
};
这是一个有效的方式来表示所有权,或者有更好的选择来做到这一点,而不使用unique_ptr
?
是的,我认为这是一个有效的方法。
在unique_ptr
的情况下,它是不可复制的,所以没有人在无意中意外复制的危险,所以传递值和传递右值引用都表示获取所有权。
在Data
的情况下,通过rvalue-reference传递文档,您正在获取所有权,并且没有调用者在无意中意外复制的危险。
是的,这是一个有效的方法。也可以按值传递:
class A {
A(Data data) : _data(std::move(data)) { }
};
Data data;
A a(std::move(data));
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 是否有必要在定义中使用模板形参来引用同一个类?
- 通过右值引用获得形参的所有权