一般来说引用指的是左值引用,它存在的目的是为了给左值起个别名。在 C++ 新版本里面出了一个新的概念——右值引用。类比前面对左值引用的理解,右值引用是应该是对右值起的别名。不过这个所谓的右值引用已经不能用右值的方式来理解,往常对右值的认识一般以常量居多,但是这个被起别名的引用居然能做一些变量才有的操作,比如说对值本身的修改。这时候称它为变量吧,变量的诸多操作与特性它也不具备。所以说比起用右值来说,另一个更加形象的说法应该是——被阉割的变量。使用常量的这步操作我只能说是借腹生子了。

同类型的变量与阉割变量,虽然类型是相同的,但是从形式上分离了,变的可以区分了。那么这种区分是为了什么呢?是为了泛型编程,准确来说是函数重载方面的泛型编程,在往常的函数重载泛型编程中,是通过同名函数的参数类型与数量对真实调用的方法进行选择,不同类型与数量的参数意味着不同的方法。但是如果我们有这么一种需要,我们希望有着相同的数据类型与数量的同名函数也能够实现不同的调用方法(这种需求下文统称第二类函数重载),那么这时候我们就需要一个与同类型变量平行的变量来对调用方法进行区分,这个平行的变量就是我们上面提到的右值引用或者也可以称作是阉割变量。

对于以上泛型编程需要的一个熟知的例子就是移动语义。

不完美的泛型编程

通过这种被阉割的变量可以实现第二类函数重载,但是这种方法实现的第二类函数重载只有两种可能,因为只有一般变量与阉割变量这两种形式来对调用的方法进行区分,如果我们希望一个函数 `void fun(int n)` 能够实现对三种或者以上方法的重载则就没办法实现。