C++:左值Lvalues和右值Rvalues

本文详细介绍了C++中的左值(Lvalues)和右值(Rvalues)概念,包括它们的定义、示例以及在程序中的作用。左值拥有可访问的地址,如变量名;而右值则不直接提供地址,如常量表达式。xvalue作为右值的一个子集,表示即将结束生命周期的对象。文章通过示例展示了左值和右值的正确和错误用法,并强调了引用对象在其中的角色。了解这些基础知识对于优化C++代码至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/it_cplusplus/article/details/118107788

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值