它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率;能够更简洁明确地定义泛型函数。

通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效。

在 C++11 之前,右值是不能被引用的,最大限度就是用常量引用绑定一个右值,如 :const int &a = 1;在这种情况下,右值不能被修改的。但是实际上右值是可以被修改的,如 :T().set().get();T 是一个类,set 是一个函数为 T 中的一个变量赋值,get 用来取出这个变量的值。在这句中,T() 生成一个临时对象,就是右值,set() 修改了变量的值,也就修改了这个右值。左值的声明符号为”&”, 为了和左值区分,右值的声明符号为”&&”。

右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。std::move在提高 swap 函数的的性能上非常有帮助,一般来说,swap函数的通用定义如下:

template <class T> swap(T& a, T& b) 
{ 
    T tmp(a); // copy a to tmp 
    a = b; // copy b to a 
    b = tmp; // copy tmp to b 
}

有了 std::move,swap 函数的定义变为 :

template <class T> swap(T& a, T& b) 
{ 
    T tmp(std::move(a)); // move a to tmp 
    a = std::move(b); // move b to a 
    b = std::move(tmp); // move tmp to b 
}

通过 std::move,一个简单的 swap 函数就避免了 3 次不必要的拷贝操作。