【发布时间】: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 会特别注意这一点吗?