C++11中value category(值类别)及move semantics(移动语义)的介绍

2020-01-06 19:32:12丽君

那么,prvalue,xvalue和lvalue是怎么定义的?

其实所有表达式都有以下两种属性:

  • 是否有identity(同一性,或者说“有身份”):是否可以与另一个表达式或对象比较,判断是否是同一个实体。比如,如果有地址,可以比较他们的地址相同;
  • 是否可以移动:如果出现在赋值,初始化等语句中,是否会使语句呈现移动语义。

    于是有:

    • 有identity,也可以移动的表达式为xvalue表达式;
    • 有identity,但不能移动的表达式为lvalue表达式;
    • 没有identity,但是可以移动的表达式为prvalue表达式;

      至于没有identity,也不可以移动的表达式,在实际应用中不存在这样的表达式,也没必要有这样的表达式。

      对于另外两种值类别,我们可以这么总结:

      • 有identity的表达式,值类别为glvalue;
      • 可以移动的表达式,值类别为rvalue。

        分析理解C++标准中决定值类别的规则