学科分类
目录
C++基础

右值引用

新标准中引入了新的引用类型-右值引用(rvalue reference),以便对将要销毁的对象信息进行保留。所谓右值引用,就是应该绑定到右值的引用。右值是相对左值而言的,左值一般指可以放在赋值符左侧的对象,普通的变量均是左值,引用运算符“&”也是对左值空间及数据的操作。右值表示的是对象的值,一般可以放在赋值符右端,常见的常量、运算表达式等都是右值。

在新标准中引入了“&&”运算符,来定义右值引用,右值引用的一个重要特性就是能够绑定到一个将要销毁的对象。因此,可以自由地将一个右值引用的资源“移动”到另一个对象中。

与左值引用类似,右值引用也是一个对象的别名。只是对于左值引用而言,不能被绑定到字面常量、运算表达式的结果或返回右值的表达式上,而右值引用恰恰相反:可以将一个右值引用绑定到这类表达式上,但不能将一个右值引用直接绑定到一个左值上。

下面给出几个引用操作示例,代码如下所示:

int i = 10;
int &r = i;                      //正确,左值引用
int &&rr = i;                    //错误,定义了右值引用,但初值是左值
int &r2 = i * 42;                  //错误,定义了左值引用,但初值是右值
const int &r3 = i * 42;              //正确,可以将一个const引用绑定到右值上
int &&rr2 = i * 42;                 //正确,定义右值引用,初值为右值

通常,可以将返回左值引用的函数、赋值操作、取下标、间接引用和前缀的自增、自减运算结果绑定到一个左值引用上,对于算术运算、关系运算、位操作等生成右值表达式的情况则可绑定到一个右值引用上。

左值引用和右值引用操作的对象不同,左值具有持久的状态,右值表示运算结果或常量这类临时内容,因此右值引用通常会绑定到即将销毁的对象,这样右值引用的代码可以自由地接管所引用对象的资源。

需要注意的是,由于变量是左值,因此不能将一个右值引用绑定到一个右值引用类型的变量上:

int &&rr1 = 10;                //正确,定义右值引用,初值为常量
int &&r2 = rr1;                 //错误,rr1是变量,是左值,不能被右值引用绑定
点击此处
隐藏目录