值的分类

来自阅读https://en.cppreference.com/w/cpp/language/value_category文档的理解,不一定按照原文翻译。
每个C ++表达式(运算符带上其操作数,字面量[*见注释1],变量名等)的特征在于两个独立的属性:类型和值类别。

  • 泛左值 (glvalue)(“泛化 (generalized)”的左值)是一个表达式,将它求值后能够确定一个对象、位域或函数的个体(identtiy,身份,个体,表示一个个体区别于其他个体的特性);
  • 纯右值 (prvalue)(“纯 (pure)”的右值)是求值符合下列之一的表达式:
    • 计算某个运算符的操作数的值(这种纯右值没有结果对象),或者
    • 初始化某个对象或位域(称这种纯右值有一个结果对象)。所有类和数组的纯右值都有结果对象,即使它被舍弃也是如此。在某些语境中,将发生临时量实质化,以创建作为其结果对象的临时量;
  • 亡值 (xvalue)(“将亡 (expiring)”,即将失效的值)是代表其资源能够被重新使用的对象或位域的泛左值;
  • 左值 (lvalue)(如此称呼的历史原因是,左值可以出现于赋值表达式的左边)是非亡值的泛左值;
  • 右值 (rvalue)(如此称呼的历史原因是,右值可以出现于赋值表达式的右边)是纯右值或者亡值。

总体分类可以看成是:左值,纯右值,将亡值。
亡值是右值,又是泛左值。

  1. 注释1 字面量:literal 表示:10,3.14, true ,123u, L"中文","abc" 这些东西。
  2. 位域
struct S {
    // will usually occupy 2 bytes:
    // 3 bits: value of b1
    // 5 bits: unused
    // 6 bits: value of b2
    // 2 bits: value of b3
    unsigned char b1 : 3;
    unsigned char :0; // start a new byte
    unsigned char b2 : 6;
    unsigned char b3 : 2;
};

xvalue(亡值,将亡值)

  • 函数调用或者重载运算符表达式,返回值是对象的右值引用,譬如:std::move(x);
  • a[n],内建下标表达式,操作数之一是数组右值。
  • a.m 对象成员表达式,a 是右值且m是非引用类型的非静态数据成员。
  • a.*mp 对象成员的指针表达式,其中a是右值且mp是数据成员的指针。
  • a?b:c,对某些bc的三元表达式。
  • 在临时量实质化后,任何指定临时对象的表达式(C++17起)

你可能感兴趣的:(值的分类)