在测试下面的代码片段时,我在这里使用一个字符串向量并尝试使用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
任何帮助都会非常感激。
答案 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));
}