c++ – value category
说到 value category ,可能大家都不知道是啥。但是说到左值,右值,可能很多人就听说了。C++将一个值作为左值、右值的分类称作 value category。
说到 value category ,首先要强调一点,就是 value category 是值的属性,不是变量的属性。所谓值,就是表达式的结果,也就是说着也是表达式结果的一个属性。同时,表达式对其子表达式的结果的 value category 可能会有一定要求。因而说到左值右值,必须明确得到这个值的表达式,或者使用这个值的表达式,否则没有意义。
另外,这里所说的值可以是一个函数(函数本身,不是函数指针)。
value category
C++11 的 value category 其实并不只有左值、右值。C++11 的每一个值可以分为三类:lvalue, xvalue(eXpiring value), prvalue(pure rvalue)。然后,lvalue 与 xvalue 合称 glvalue (general lvalue);xvalue 与 prvalue 合称 rvalue。
对各类的简要说明如下:
- lvalue: 一个对象
- xvalue: 也是一个对象,通常已经接近生存期的终点
- glvalue: lvalue 与 xvalue
- rvalue: xvalue, 临时对象,或前面两者的子对象,或没有对象的值
- prvalue: 不是 xvalue 的 rvalue 。
仅依靠上面的说明来区分 value category 似乎有些困难,不过标准也没有期望能通过以上的说明区分不同 value category。标准采用的另一种方式定义 value category ,及明确的规定了每一种表达式的结果的 value category 。同时说明的每一种表达式所期望的操作数的 value category (对于操作数,没有