C++右值引用(&&)
在 C++11 标准出现之前,程序中只有左值与右值的概念,简单来说,左值就是
C++11 标准对右值进行了更详细的划分,将右值分为纯右值与将亡值:
随着对右值的详细划分,C++11 标准提出了右值引用的概念,右值引用就是定义一个标识符引用右值,右值引用通过“&&”符号定义,定义格式如下所示:
下面定义一些右值引用,示例代码如下所示:
右值引用只能引用右值,不能引用左值,错误示例代码如下所示:
注意,一个已经定义的右值引用是一个左值,即已经定义的右值引用是可以被赋值的变量,因此不能使用右值引用来引用另一个右值引用,示例代码如下所示:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
=
符号左边的值,右值就是=
符号右边的值。区分左值与右值的一个简单、有效的方法为:可以取地址的是左值,不可以取地址的是右值。C++11 标准对右值进行了更详细的划分,将右值分为纯右值与将亡值:
- 纯右值是指字面常量、运算表达式、lambda 表达式等;
- 将亡值是那些即将被销毁却可以移动的值,如函数返回值。
随着对右值的详细划分,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上
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。