std::move
简介
#include //使用的头文件
std::move将对象的所有权从一个对象转移到另外一个对象;
std::string str1 = "string_1";
std::string str2 = std::move(str1);
系统中的块内存用str1来命名,这块内存存储的内容为“string_1”;str2 = std::move(str1),内存本身不会发生任何改变,改变的只是表示这块内存的名称,这块内存的所有权从str1转移到str2;
#include <iostream>
#include <utility>
#include <string>
int main()
{
std::string str1 = "string_1";
std::string str2 = std::move(str1);
std::cout<<"str1 is: "<<str1<<std::endl;
std::cout<<"str2 is: "<<str2<<std::endl;
str1 = "move test";
std::cout<<"str1 is: "<<str1<<std::endl;
std::cout<<"str2 is: "<<str2<<std::endl;
return 0;
}
运行结果:
str1 is:
str2 is: string_1
str1 is: move test
str2 is: string_1
使用场景
可用
如果在函数中生成了string str1,并且需要将其保存到std::vector< std::string > 中,则可以使用std::move
std::vector<std::string> strVec;
strVec.push_back(std::move(str1));
strVec.push_back(std::move(str2));
std::cout<<"str1 is: "<<str1<<std::endl;
std::cout<<"str2 is: "<<str2<<std::endl;
for(auto au : strVec){
std::cout<<"value is: "<<au<<std::endl;
}
输出结果:
str1 is:
str2 is:
value is: move test
value is: string_1
慎用
在不同的组件或者模块之间交互时慎用,尤其是交互接口的参数是指针;
void fun1(std::string& str)
{
std::string s1 = std::move(str);
std::cout<<"s1 is: "<<s1<<std::endl;
}
void fun2()
{
std::string s2 = "function test";
std::cout<<"s2 is:"<<s2<<std::endl;
fun1(s2);
std::cout<<"s2 is:"<<s2<<std::endl;
}
输出结果:
s2 is:function test
s1 is: function test
s2 is: