move(左值):移动语义,得到右值类型,(int&&)a
右值引用是为了和move搭配使用的。而move函数的作用就只有一个:减少内存开销。move函数实际可以理解为类swap函数,其函数实现的功能就是把函数作用的对象所占有的内存移交给函数等号左边的对象管理。
move函数的注意点有三个:
1、move函数可以移动内存所有权的前提是等号左边的对象有移动构造函数,如果是类似于int,char[10]等类型的对象,由于其不存在移动构造函数,因此仍然会调用复制构造函数来创建对象;
2、当等号左边为一个正常对象时,move后作用的对象由于不再占有任何内存,因此其值会变为NULL或"",因此move只应该作用于临时变量或者右值。
3、当等号左边为一个右值引用类型对象时,如string b=“ab”; string && s= move(b),由于s的本质是引用,因此s会和b占有同样的内存,执行这句话完毕后b不会变为""。直到有string c=move(s)或string c=move(b)时,s和b对内存的所有权才会移交给c,s和b变为""。实际上,让右值引用类型的对象的值为一个左值move是毫无意义的。
forward类型完美转发:能够识别左值跟右值类型
forward中接受的参数是通过函数传递进来的右值引用
使用forward的时候,不能忽略它的模板参数。最好的写法是被forward的参数的类型如果声明为x&&,那么就要写std::forward。其中:当X是一个非引用类型的时候,forward会把类型为x&&的参数处理成右值引用。如果X是一个左值引用类型的时候,forward会把类型为x&&的参数处理成左值引用
std::move无条件转换到右值。就其本身而言,它没有move任何东西。
std::forward只有在它的参数绑定到一个右值上的时候,它才转换它的参数到一个右值。
std::move和std::forward在运行期都没有做任何事情。
- std::move是将左值变成右值减少不必要的拷贝;
- std::forward保持一个值的左值和右值特性不变,以变传给既能接受左值又能接受右值的函数(针对模板函数)