c++11增加了一个新的类型--右值引用,而移动语义是通过右值引用来匹配临时值的.
尽管不能将一个右值引用直接绑定到一个左值上,但可以通过move将一个左值显示的转换为对应的右值引用类型
move,这是一个具有迷惑性的名字,实际上,move函数并没有真正的移动对象,他只是将该对象从一个左值转换为一个右值
#include <iostream>
#include <string>
using namespace std;
void func(string&& str)
{
cout << "here is func : " << str << endl;
}
int main()
{
string a = "here is a test";
func(move(a));
cout << "a : " << a << endl << endl;
string&& b = move(a);
cout << "b : " << b << endl;
cout << "a : " << a << endl;
}
输出结果为
here is func : here is a test
a : here is a test
b : here is a test
a : here is a test
可见,并没有发生实际的移动.
而:
#include <iostream>
#include <string>
using namespace std;
void func(string&& str)
{
cout << "here is func : " << str << endl;
}
int main()
{
{
string a = "here is a test";
string b = move(a);
cout << "a : " << a << endl;
cout << "b : " << b << endl << endl;
}
{
string a = "here is a test";
string b(move(a));
cout << "a : " << a << endl;
cout << "b : " << b << endl << endl;
}
}
输出结果为:
a :
b : here is a test
a :
b : here is a test
总结
所以,move并不会移动对象,真正的移动操作在移动构造函数和移动赋值函数,move就是一个类型转换,不要被名字迷惑