左值、右值
在C++中,可以取地址、有名字的就是左值,不能取地址、没有名字的就是右值。
在a = b + c
中&a
是允许的操作,但&(b + c)
则不会通过编译,因此a
是一个左值,b + c
是一个右值。
左值、将亡值、纯右值
在C++11中右值又分为将亡值、纯右值。
其中纯右值就是C++98中的右值概念,非引用返回的临时变量值、上例中a + b
的临时变量值,字面值常量比如2、'a'、true,此外还有类型转换函数的返回值、lambda
表达式等都是纯右值。
将亡值则是C++11新增的右值引用相关的表达式,比如返回右值引用T&&
的函数返回值、std::move
的返回值。
在C++11中所有程序中所有的值都属于左值、将亡值、纯右值中的一种。
右值引用
假设有函数T ReturnValue()
,该函数的返回值就是一个纯右值,如果我们对该函数采用T t = ReturnValue()
那么就会进行一次对象的析构、构造,但是如果我们采用C++11中的右值引用:
T && t = ReturnValue();
那么就可以减少这一次对象析构、构造的成本,ReturnValue()
的返回值将直接变成右值引用。
注意
右值引用不能绑定到左值上,左值引用不可以绑定到右值上,常左值引用可以绑定到右值上。