【问题标题】:How to move object internals out?如何将对象内部移出?
【发布时间】:2014-11-17 07:49:27
【问题描述】:

让我们考虑以下类:

class Big
{
public: 
    std::vector<int> convertToVector();
private:
    std::vector<int> data_;
};

我希望Big::convertToVector() 将对象取出并将数据移动到外面。

我正在考虑:

std::vector<int> Big::convertToVector()
{
    return std::move(data_);
}

这是正确的做法吗?

【问题讨论】:

  • 是的。这就是将数据移出的方式。

标签: c++11 move move-semantics


【解决方案1】:

是的,这是正确的方法。

不过,您必须非常小心,因为您的旧向量处于未指定状态;您可能想清空它以避免意外。

std::vector<int> Big::convertToVector() {
    std::vector<int> temp;
    std::swap(temp, _data);

    return std::move(temp);
}

【讨论】:

  • 任何被移动的对象都必须保持有效,因此不需要交换。我只是不确定返回类型。
  • @MartinDrozdik oopsie,看来你是对的 - 保证将移动的参数保持在有效但未指定的状态。顺便说一句,这仍然使我的解决方案合理,我会说。它还应该产生最小的运行时开销。
  • @MartinDrozdik 而当我们这样做的时候,如果你把它写成std::vector&lt;int&gt; Big::convertToVector() &amp;&amp;,你可以完全跳过那个交换,因为无论如何这个对象应该在调用之后被销毁。
【解决方案2】:

据我所知,std::vector 有移动构造函数,所以你只需这样做(就像我对其他容器所做的那样)

std::vector<int> Big::convert_to_vector() { return data_; }

【讨论】:

  • 这只是创建了data_的副本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2014-10-05
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多