C++中的值类别和引用

2021/05/03

任何一个C++表达式(操作符和操作数,字面值,变量名等)都有两个不同的特征:数据类型以及它的值类别(请勿将二者混为一谈)。数据类型是我们非常熟悉的int、float、double或者其他诸如struct、class等的一些复合类型,这篇文章中,我们将会谈到一个已经是老生常谈但会被很多人忽视掉的内容,值类别。 简单来说,值类别分为两种,左值(lvalue)与右值(rvalue)(其实还可进行细分,如prvalue,xvalue,glvalue等,但其内容较为深入且与本文并无太大关系,故不做赘述)。左值,顾名思义,为出现在等号左边的值(不是非常准确但有助于理解),因此它可以被赋值,这就代表着它有自己的名字对应的地址,可以出现在多条表达式中。而右值,姑且理解为出现在等号右边的值,也既临时变量(对象)。右值没有自己的名字,也无法在多个表达式中重复使用。 因此,很多人可能会认为,右值无法被修改,它在整个生存周期内都会保持不变。实则不然,我们来看下面这个表达式:

T().set().get();

T为一个类,set为其中某个成员变量赋值,get则用来获取这个成员的值。我们可以发现,在构造函数T()返回了T的一个实例(此时为一个右值)之后,set函数对其进行了修改。因此,右值是可以被修改的。对于可以被修改却没有名字的值,很显然,我们应当对其引入引用的概念。

右值引用

C++11中引入了右值引用这一概念,为了和左值引用‘&’区分,C++11使用两个引号‘&&’来表示右值引用。定义方法如下

int &&x = 1;