【问题标题】:Take ownership of parameter by rvalue-reference通过右值引用获取参数的所有权
【发布时间】:2016-09-27 09:57:17
【问题描述】:

我想明确一点,我的类A 的构造函数将获得传递的Data 参数的所有权。显而易见的做法是按值获取unique_ptr

class A
{
public:
    A(std::unique_ptr<Data> data) : _data(std::move(data)) { }

    std::unique_ptr<Data> _data;
};

但是,对于我的用例,没有理由 Data 应该是指针,因为值类型就足够了。我能想到的唯一剩下的选项是通过右值引用传递:

class A
{
public:
    A(Data&& data) : _data(std::move(data)) { }

    Data _data;
};

这是表示所有权的有效方式,还是有更好的选择不使用unique_ptr

【问题讨论】:

  • 为什么 ctor 取得所有权?
  • 我会明确构造函数
  • @IvanRubinson 出于多种原因,例如依赖注入。
  • 好吧,你回答了你自己的问题,是的,移动 ctor 和 rvalues 通常是要走的路:)
  • Data 可复制吗?

标签: c++ c++11 unique-ptr rvalue-reference


【解决方案1】:

是的,我认为这是一种有效的方式。

unique_ptr 的情况下,它是不可复制的,所以不会有人在不打算这样做时意外复制的危险,同时传递值和传递右值引用表示取得所有权。

Data 的情况下,传递右值引用文件表明您拥有所有权,并且调用者不会在无意中意外复制副本的危险。

【讨论】:

    【解决方案2】:

    是的,这是一种有效的方式。也可以传值:

    class A {
        A(Data data) : _data(std::move(data)) { }
    };
    Data data;
    A a(std::move(data));
    

    【讨论】:

    • 当然这也是一种选择。但是,它不会强制移动对象,因此可能会制作不必要的副本。
    • @angelag 在这种情况下,我认为按值传递可能是更好的选择。如果您希望Data 始终只有一个所有者,那么您应该使其不可复制,并按值传递Data,就像您对unique_ptr 所做的那样。否则,即Data 是可复制的,按值传递给客户端两个选择:复制它或“移动”它。它更灵活,有时客户端可能希望在将Data 传递给A 的构造函数后保留一份副本。
    猜你喜欢
    • 2012-09-14
    • 2019-08-28
    • 2015-07-17
    • 1970-01-01
    • 2021-10-26
    • 2020-07-10
    • 2014-09-09
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多