如何将std :: move应用于函数返回值?

时间:2015-03-09 06:19:03

标签: c++ c++11 vector std move

在测试下面的代码片段时,我在这里使用一个字符串向量并尝试使用std::move(vector)返回它。如果我使用像std::vector<std::string>&& getVector()这样的成员函数签名,那么它的工作正常。如果我正在使用此std::vector<std::string>& getVector(),那么它不会移动/清除矢量内容。

请让我知道要遵循的正确移动语义。请解释两个代码之间的区别。

代码:

#include <iostream>
#include <vector>
#include <string>

class VectorMoveDemo
{
public:
    void add(std::string item)
    {
        results_.push_back(item);
    }
    std::vector<std::string>& getVector()
    {
        return std::move(results_);
    }
private:
    std::vector<std::string> results_;
};

int main()
{
    VectorMoveDemo v;
    v.add("Hello ");

    std::cout << "First Time : " << "\n";
    std::vector<std::string> temp = v.getVector();
    for(auto &item : temp)
    {
        std::cout << item << "\n";
    }
    std::cout << "Second Time : " << "\n";

    v.add("World");

    std::vector<std::string> temp2 = v.getVector();
    for(auto &item : temp2)
    {
        std::cout << item << "\n";
    }
}

首先

std::vector<std::string>& getVector()
{
    return std::move(results_);
}

输出

First Time :
Hello
Second Time :
Hello
World

第二

std::vector<std::string>&& getVector()
{
    return std::move(results_);
}

输出

First Time :
Hello
Second Time :
Hello
World

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

  

我想在向量中添加新值之前清除先前的向量值。这里getVector()应该清空矢量内容。

在这种情况下,根本不需要std::move

std::vector<std::string> getVector()
{
    std::vector<std::string> temp;
    temp.swap(results_);
    return temp;
}

但是,您可以在其他成员函数中使用std::move

void add(std::string item)
{
    results_.push_back(std::move(item));
}