C++11标准引入的是右值引用的概念来方便我们操作右值,但右值的概念是在之前的版本中就有的。在引入右值引用概念后,左右值也被分为左值(lvalue)、将亡值(xvalue)、纯右值(prvalue)。其中将亡值和左值合称为泛左值,将亡值和纯右值合称为右值。
- 左值可以形象理解为可以取到地址的值
比如字符串字面量能取到地址,是左值。 - 纯右值例如整型字面量或者求值结果相当于是字面值或者不具名的临时对象
- 将亡值包括类似
T && foo()
函数返回的右值引用或由std::move
强转来的右值引用。
将亡值属于泛左值,又属于右值。属于泛左值是由于将亡值作为右值引用是具名的,这和纯右值如字面量不一样,所以被视为左值。作为右值是由于将亡值具有可移动性。而将亡值之所以又具名又能移动,是因为它要死了。
这些概念的区分涉及到 Value categories,在这里会有简单讨论。
注意类似 T foo()
的函数返回值是纯右值。在使用右值和移动语义时容易产生下面的问题:
- 右值、右值引用之间有什么区别
- 重载决议中右值引用、左值引用、通用引用有什么区别
- 右值、(N)RVO之间的关系是什么
- 移动语义在哪些地方可以提高性能
诸如此类,在本文中详细讲解。