C++11新引入了右值引用的概念。
本质上来说,左值就是在内存中可以寻址的对象(表现形式是可以通过&操作符取指),而右值是在寄存器中或者内存中的匿名对象。
左值可以存在赋值运算符左右两边,但右值只能存在赋值运算符右边(这有个例外,当一个类对象重载了负值运算符时,该类对象作为右值也可以存在赋值运算符左边)。比如,
int a = 0; // a是左值
2 = a; // error, 2是匿名对象,是右值,不能放在赋值运算符左边
a++ = 5; // error,a++表达式返回的是直接数0,是个匿名对象,不能作为左值,只能作为右值
++a = 6; // ok, ++a表达式返回的是对象a,因此可以作为左值(这点C++和传统C语言有所不同)
引用是对象的别名,引用分为左值引用和右值引用。引用在声明时就需要被赋值。
左值引用是对左值对象的引用,并且只能引用左值;而右值引用是对右值的引用,并且只能引用右值。一个右值表达式对象通常在表达式结束时即销毁,而右值表达式被右值引用时,会延长右值表达式对象的生命周期,知道右值引用结束。
左值引用的语法如下:
int a = 10;
int &b = a; // ok,左值引用声明时初始化,引用一个左值表达式。
int &c = 10; // error,左值引用只能引用左值表达式,不能引用右值表达式。
右值引用的语法如下:
int a = 10;
int &&b = a; // error, 右值引用只能引用右值表达式,不能引用左值表达式。
int &&c = 10; // ok
转载至链接:https://my.oschina.net/yepanl/blog/1929004