那么,prvalue,xvalue和lvalue是怎么定义的?
其实所有表达式都有以下两种属性:
- 是否有identity(同一性,或者说“有身份”):是否可以与另一个表达式或对象比较,判断是否是同一个实体。比如,如果有地址,可以比较他们的地址相同;
-
是否可以移动:如果出现在赋值,初始化等语句中,是否会使语句呈现移动语义。
于是有:
- 有identity,也可以移动的表达式为xvalue表达式;
- 有identity,但不能移动的表达式为lvalue表达式;
-
没有identity,但是可以移动的表达式为prvalue表达式;
至于没有identity,也不可以移动的表达式,在实际应用中不存在这样的表达式,也没必要有这样的表达式。
对于另外两种值类别,我们可以这么总结:
- 有identity的表达式,值类别为glvalue;
-
可以移动的表达式,值类别为rvalue。
分析理解C++标准中决定值类别的规则










