通过右值引用获取参数的所有权

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 的情况下,通过右值引用文档表明您正在取得所有权,并且调用者不存在意外复制他们不打算复制的危险。