【问题标题】:How std::move applied on function return value?std::move 如何应用于函数返回值?
【发布时间】:2015-05-10 06:23:12
【问题描述】:

在测试下面的代码 sn-p 时,我在这里使用一个字符串向量并尝试使用 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

任何帮助将不胜感激。

【问题讨论】:

  • 不要那样做。按值返回已经给了你右值。
  • 你到底想让getVector做什么?将向量移出类到调用者?那么子序列v.add 将是非法的。请说明您的意图。
  • @FredOverflow 我想在 vectore 中添加新值之前清除以前的向量值。这里getVector() 应该清空向量内容。
  • 第一个版本不应该编译。您使用的是哪个编译器?此外,您不能依赖移出向量的状态;未指定。
  • @T.C.我将 Visual Studio 2013 用于 C++ 应用程序。所以 Visual Studio 会特别注意这一点吗?

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


【解决方案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));
}

【讨论】:

  • 根据我的要求,我必须使用移动。要求是这样的:return reference to vector. Use std::move(vector) to clear vector
  • 此外,我想了解为什么我会得到 &amp;&amp;&amp; 的两个不同输出。请详细说明。我是 C++ 的新手。
  • 什么要求?这是作业吗?如果您只在成员函数中写入return std::move(results_);,则该向量无效,随后的push_backs 会导致未定义的行为。你可以return std::move(temp);,但那将是一种悲观,因为它抑制了RVO(返回值优化)。所以这样做只是为了满足你固执的老师。
  • 同样,&amp; 版本不能在符合标准的编译器上编译,&amp;&amp; 版本在您之后调用 push_back 时会导致未定义的行为。所以讨论你的系统会产生什么输出真的没有意义。
  • 是的,这是作业项目,我只需要在这里演示 std::move 的用法。
猜你喜欢
  • 2017-10-19
  • 2016-03-09
  • 2012-09-15
  • 2015-06-04
  • 1970-01-01
相关资源
最近更新 更多