左值引用和右值引用

引用在本质上是一个别名,可以通过引用修改变量的值,在函数传参时传引用可以避免拷贝以提高运算速度,其实现原理和指针类似。在 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) 这个函数的返回值。

Leave a Reply

Your email address will not be published. Required fields are marked *