move
c++11中添加了右值引用,不能使用左值来初始化右值引用,如果想要使用左值初始化一个右值需要借助std::move()函数,使用std::move/方法可以将左值转换为右值,使用这个函数并不能转移任何东西,而是和移动构造函数一样都具有移动语义,将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。
使用示例:
直接将变量a初始化一个右值引用的b是错误的,因为a是一个左值,但是使用了move之后可以将a转换成一个右值,将a的资源转移给c;
还可以用于容器的值转移:
使用std::move可以避免了拷贝,提高效率。另外,我们可以给类编写相应的移动构造函数(T::T(T&& anonter))和具有移动语义的赋值函数(T&&T::operator=(T&&rhs)),在构造对象和赋值的时候尽可能的进行资源的重复利用,因此他们都是接收一个右值引用的效果。
forward
右值引用是独立于值的,一个右值应用作为函数参数的形参时候,在函数内部转发该参数给内部其他函数时,他就变成了一个左值,并不是原来的类型了,如果需要按照参数原本类型转发到另一个函数,可以使用std::forward函数,该函数实现的功能称为完美转发。
std::forward<T>(t);
当T为左值引用类型时,t将被转换为T类型的左值。
当T不是左值引用类型时,t将被转换为T类型的右值。
------------------------------------------------
上述如有错误欢迎大家指正