首页 > 编程笔记

C++右值引用(&&)

在 C++11 标准出现之前,程序中只有左值与右值的概念,简单来说,左值就是=符号左边的值,右值就是=符号右边的值。区分左值与右值的一个简单、有效的方法为:可以取地址的是左值,不可以取地址的是右值。

C++11 标准对右值进行了更详细的划分,将右值分为纯右值与将亡值:
随着对右值的详细划分,C++11 标准提出了右值引用的概念,右值引用就是定义一个标识符引用右值,右值引用通过“&&”符号定义,定义格式如下所示:

类型&& 引用名称=右值;

在上述格式中,类型是要引用的右值的数据类型,&&符号表明这是一个右值引用,引用名称遵守标识符命名规范,=符号后面是要引用的右值。

下面定义一些右值引用,示例代码如下所示:
int x = 10, y = 20;
int&& r1 = 100;   //字面常量100是一个右值
int&& r2 = x + y;   //表达式x+y是一个右值
int&& r3 = sqrt(9.0);   //函数返回值是一个右值
与左值引用相同,右值引用在定义时也必须初始化。

右值引用只能引用右值,不能引用左值,错误示例代码如下所示:
int x = 10, y = 20;
int&& a = x;   //错误
int&& b = y;   //错误
在上述代码中,变量 x、y 都是左值,因此不能将它们绑定到右值引用。

注意,一个已经定义的右值引用是一个左值,即已经定义的右值引用是可以被赋值的变量,因此不能使用右值引用来引用另一个右值引用,示例代码如下所示:
int&& m = 100;
int&& n = m;   //错误,m是变量,是左值,不能被绑定到右值引用n上

优秀文章