通过右值引用获取参数的所有权
Take ownership of parameter by rvalue-reference
我想明确表示 class A
的构造函数将取得传递的 Data
参数的所有权。显而易见的事情是按值取 unique_ptr
:
class A
{
public:
A(std::unique_ptr<Data> data) : _data(std::move(data)) { }
std::unique_ptr<Data> _data;
};
但是,对于我的用例,Data
没有理由应该是指针,因为值类型就足够了。我能想到的唯一可以明确说明 Data
将由 A
拥有的选项是通过右值引用传递:
class A
{
public:
A(Data&& data) : _data(std::move(data)) { }
Data _data;
};
这是表明所有权的有效方式吗?或者是否有更好的选择来做到这一点而不使用 unique_ptr
?
是的,这是一个有效的方法。也可以传值:
class A {
A(Data data) : _data(std::move(data)) { }
};
Data data;
A a(std::move(data));
是的,我认为这是一个有效的方法。
在 unique_ptr
的情况下,它是不可复制的,因此不存在有人在无意中意外复制的危险,因此无论是按值传递还是传递-rvalue-reference 表示取得所有权。
在 Data
的情况下,通过右值引用文档表明您正在取得所有权,并且调用者不存在意外复制他们不打算复制的危险。
我想明确表示 class A
的构造函数将取得传递的 Data
参数的所有权。显而易见的事情是按值取 unique_ptr
:
class A
{
public:
A(std::unique_ptr<Data> data) : _data(std::move(data)) { }
std::unique_ptr<Data> _data;
};
但是,对于我的用例,Data
没有理由应该是指针,因为值类型就足够了。我能想到的唯一可以明确说明 Data
将由 A
拥有的选项是通过右值引用传递:
class A
{
public:
A(Data&& data) : _data(std::move(data)) { }
Data _data;
};
这是表明所有权的有效方式吗?或者是否有更好的选择来做到这一点而不使用 unique_ptr
?
是的,这是一个有效的方法。也可以传值:
class A {
A(Data data) : _data(std::move(data)) { }
};
Data data;
A a(std::move(data));
是的,我认为这是一个有效的方法。
在 unique_ptr
的情况下,它是不可复制的,因此不存在有人在无意中意外复制的危险,因此无论是按值传递还是传递-rvalue-reference 表示取得所有权。
在 Data
的情况下,通过右值引用文档表明您正在取得所有权,并且调用者不存在意外复制他们不打算复制的危险。