C++11 如何将对象内部构件移出? 让我们考虑下面的类: class Big { public: std::vector<int> convertToVector(); private: std::vector<int> data_; };

C++11 如何将对象内部构件移出? 让我们考虑下面的类: class Big { public: std::vector<int> convertToVector(); private: std::vector<int> data_; };,c++11,move,move-semantics,C++11,Move,Move Semantics,这是正确的方法吗?据我所知,std::vector有移动构造函数,所以您只需这样做(就像我对其他容器所做的那样) std::vector Big::convert_to_vector(){返回数据} 是的,这是正确的方法 但是,您必须非常小心,因为您的旧向量处于未指定的状态;您可能希望清空它以避免意外 std::vector<int> Big::convertToVector() { std::vector<int> temp; std::swap(tem

这是正确的方法吗?

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

std::vector Big::convert_to_vector(){返回数据}

是的,这是正确的方法

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

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

    return std::move(temp);
}
std::vector Big::convertToVector(){
std::向量温度;
标准::交换(温度,_数据);
返回标准::移动(温度);
}

Yes。这是将数据移出的方法。这只会创建
数据的副本
任何已移动的对象都必须保持有效,因此不需要交换。我只是不确定返回类型。@MartinDrozdik oopsie,看来您是对的-保证将moved from参数保持在有效但未指定的状态。顺便说一下,这仍然使我的解决方案合理。它还应该产生最小的运行时开销。@MartinDrozdik,在我们进行此操作时,如果您将其编写为
std::vector Big::convertToVector()&&&
,则可以完全跳过该交换,因为无论如何在调用之后都应该销毁该对象。
std::vector<int> Big::convert_to_vector() { return data_; }
std::vector<int> Big::convertToVector() {
    std::vector<int> temp;
    std::swap(temp, _data);

    return std::move(temp);
}