std::move 如何应用于函数返回值
How std::move applied on function return value?
在测试下面的代码片段时,这里我取了一个字符串向量并尝试用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()
应该清空矢量内容。
在这种情况下,根本不需要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));
}
相关文章:
- 程序不向函数返回值
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 存储函数返回值或立即使用c++
- 如何删除新分配的字符,这也是函数返回值?
- 不从函数返回值会导致段错误
- lambda 函数返回值的有效性
- 如何获取有关 Visual Studio 代码分析中未经检查的函数返回值的警告
- 存储指向函数返回值的指针
- 在 OOP 中,调用函数返回值还是直接调用值更快?
- 函数返回值的自动类型扣除
- 为循环中多次调用的函数返回值预分配内存的正确方法是什么
- 函数返回值的位运算符提升
- 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时计算
- C++ ReSharper - 生成函数返回值/参数类型的变量
- std::clamp - 检测函数返回值是否绑定到 const T&
- C 递归函数返回值
- 是否可以在C 中使回调函数返回值
- C++标准是否保证函数返回值具有常量地址?
- 将函数返回值传递给引用参数会导致 GCC 中的编译错误
- 函数返回值错误