通过右值引用获得形参的所有权

Take ownership of parameter by rvalue-reference

本文关键字:形参 所有权 引用      更新时间:2023-10-16

我想明确我的类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));