引用在本质上是一个别名,可以通过引用修改变量的值,在函数传参时传引用可以避免拷贝以提高运算速度,其实现原理和指针类似。在 C++ 11 引入右值引用之前,所有引用都指的是左值引用:
int x = 3, y = 5;
int & ref = x; //正确
int & ref = 5; //编译失败, 左值引用不能指向右值
const int & r = 8; //正确
这两种左值引用存在一个局限性,普通的左值引用无法指向右值,例如 int & ref = foo(2); 带 const 的左值引用虽然可以指向右值,但是在函数调用时又无法修改这个引用, 。为了解决这个痛点,更大限度地提高运算速度,C++ 11中就引入了右值引用: int && ref = 8;
声明出来的左值引用和右值引用都是左值,因为它们是变量,有名字,可以取地址,也可以放到赋值号左边被赋值。
作为函数返回值的右值引用没有名字,地址不可用,所以是右值, 例如 std::move(y) 这个函数的返回值。