来自阅读https://en.cppreference.com/w/cpp/language/value_category文档的理解,不一定按照原文翻译。
每个C ++表达式(运算符带上其操作数,字面量[*见注释1],变量名等)的特征在于两个独立的属性:类型和值类别。
- 泛左值 (glvalue)(“泛化 (generalized)”的左值)是一个表达式,将它求值后能够确定一个对象、位域或函数的个体(identtiy,身份,个体,表示一个个体区别于其他个体的特性);
- 纯右值 (prvalue)(“纯 (pure)”的右值)是求值符合下列之一的表达式:
- 计算某个运算符的操作数的值(这种纯右值没有结果对象),或者
- 初始化某个对象或位域(称这种纯右值有一个结果对象)。所有类和数组的纯右值都有结果对象,即使它被舍弃也是如此。在某些语境中,将发生临时量实质化,以创建作为其结果对象的临时量;
- 亡值 (xvalue)(“将亡 (expiring)”,即将失效的值)是代表其资源能够被重新使用的对象或位域的泛左值;
- 左值 (lvalue)(如此称呼的历史原因是,左值可以出现于赋值表达式的左边)是非亡值的泛左值;
- 右值 (rvalue)(如此称呼的历史原因是,右值可以出现于赋值表达式的右边)是纯右值或者亡值。
总体分类可以看成是:左值,纯右值,将亡值。
亡值是右值,又是泛左值。
- 注释1 字面量:literal 表示:10,3.14, true ,123u, L"中文","abc" 这些东西。
- 位域
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
,对某些b
和c
的三元表达式。 - 在临时量实质化后,任何指定临时对象的表达式(C++17起)