C++:左值Lvalues和右值Rvalues
C++:左值Lvalues和右值Rvalues
每个 c + + 表达式都具有类型,属于 值类别。 值类别是编译器在表达式计算过程中创建、复制和移动临时对象时必须遵循的规则的基础。
C + + 17 标准定义表达式值类别,如下所示:
Glvalue 是一个表达式,其计算确定对象、位域或函数的标识。
Prvalue 是一个表达式,其计算初始化对象或位域,或计算运算符的操作数的值,由其出现的上下文指定。
Xvalue 是一个 glvalue,它表示可重复使用其资源的对象或位域, (通常是因为它接近生存期) 结束。 示例:涉及) 右值引用的某些类型的表达式 (8.3.2 生成 xvalues,如对其返回类型为右值引用或强制转换为右值引用类型的函数的调用。
左 值是不是 xvalue 的 glvalue。
右 值为 prvalue 或 xvalue。
下图说明了类别之间的关系:
左值具有程序可以访问的地址。 左值表达式的示例包括变量名称,包括变量 const 、数组元素、返回 lvalue 引用的函数调用、位字段、联合和类成员。
Prvalue 表达式没有可通过程序访问的地址。 Prvalue 表达式的示例包括:文本、返回非引用类型的函数调用,以及在表达式评估期间创建但仅由编译器访问的临时对象。
Xvalue 表达式的地址不能再由您的程序访问,但可用于初始化 rvalue 引用,后者提供对表达式的访问。 示例包括返回右值引用的函数调用,以及数组下标、成员和指针到数组或对象为右值引用的成员表达式。
示例
以下示例演示左值和右值的多种正确的和错误的用法:
// lvalues_and_rvalues2.cpp
int main()
{
int i, j, *p;
// Correct usage: the variable i is an lvalue and the literal 7 is a prvalue.
i = 7;
// Incorrect usage: The left operand must be an lvalue (C2106).`j * 4` is a prvalue.
7 = i; // C2106
j * 4 = 7; // C2106
// Correct usage: the dereferenced pointer is an lvalue.
*p = i;
// Correct usage: the conditional operator returns an lvalue.
((i < 3) ? i : j) = 7;
// Incorrect usage: the constant ci is a non-modifiable lvalue (C3892).
const int ci = 7;
ci = 9; // C3892
}
备注
此主题中的示例阐释了未重载运算符时的正确和错误用法。 通过重载运算符,可以使表达式(如 j * 4)成为左值。
当引用对象引用时,通常使用字词 lvalue 和 右 值。
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处
本文章博客地址:https://blog.csdn.net/it_cplusplus/article/details/118107788