【C++】值类别

值类别

每个表达式都有一个类型(type),该类型描述其计算产生的值的静态类型。表达式7具有int类型,表达式5 + 2也是如此,如果x是int类型变量,则表达式x也具有int类型。每个表达式还有一个值类别(value categories),该类别描述了值是如何形成的,以及如何影响表达式的行为。

三种基本值类别:左值(lvalue)、亡值(xvalue)、纯右值(prvalue)。
混合类别:泛左值(glvalue)、右值(rvalue)。

	  expression
      /        \
    glvalue   rvalue
    /     \   /    \
lvalue   xvalue   prvalue 

左值

举例

  • 变量、函数、模板形参对象 (C++20 起)或数据成员的名字,不论类型,例如 std::cin 或 std::endl。即使变量的类型是右值引用,由它的名字构成的表达式仍是左值表达式;
  • 返回类型是左值引用的函数调用或重载运算符表达式
  • a = b,a += b,a %= b,以及所有其他内建的赋值及复合赋值表达式。
  • ++a 和 --a,内建的前置自增与前置自减表达式。
  • *p,内建的间接寻址表达式。
  • 字符串字面量。
  • 转换到左值引用类型的转型表达式,例如 static_cast(x)

性质

  • 能用&取地址。

亡值

举例

  • 返回类型是对象的右值引用的函数调用或重载运算符表达式,例如 std::move(x)
  • 转换到对象的右值引用类型的类型转换表达式,例如 static_cast(x)

纯右值

举例

  • 除了字符串以外的字面量。
  • 返回类型是非引用的函数调用或重载运算符表达式,例如 str.substr(1, 2)str1 + str2it++
  • a++ 和 a–,内建的后置自增与后置自减表达式。
  • 算术表达式(a + b、a % b…),逻辑表达式(a&&b…),比较表达式(a>b…)。
  • &a,内建的取地址表达式。
  • 转换到非引用类型的转型表达式,例如 static_cast(x)

暂时只总结了这么多,以后再补充:)

你可能感兴趣的:(c++,开发语言)