lvalue、xvalue、prvalue(一):三者的分类

复制代码
expression
├── glvalue
│   ├── lvalue
│   └── xvalue ──┐
└── rvalue        │
    ├── xvalue ──┘
    └── prvalue

关键点:上面两处 xvalue 是同一个类别,不是两个不同的东西 。它是 glvalue 和 rvalue 的交集------从"有没有 identity"这个维度看,它属于 glvalue;从"能不能被移动"这个维度看,它又属于 rvalue。所以真正互斥、构成完整划分的"基本"类别只有三个:lvalue、xvalue、prvalue(正是你最后总结的"左值、纯右值、将亡值"),而 glvalue 和 rvalue 只是这三者的两种组合方式:

  • glvalue = lvalue ∪ xvalue("generalized lvalue",广义左值)
  • rvalue = xvalue ∪ prvalue

标准(basic.lval)实际上是用两个正交属性定义出这三个基本类别的:

可被移动 不可被移动
有 identity xvalue(将亡值) lvalue(左值)
无 identity prvalue(纯右值) 不存在这种表达式

("有 identity"指的是能否判断两次求值是不是指向同一个实体,比如能不能取地址、比较地址。)

举几个例子对应一下:

  • lvalue :变量名 x,解引用 *p,下标 a[0],返回 T& 的函数调用
  • xvalue :std::move(x),返回 T&& 的函数调用,static_cast<T&&>(x)
  • prvalue :字面量 42、3.14,返回非引用类型 T 的函数调用,甚至 this 指针本身(虽然它指向的对象有 identity,但 this 这个表达式本身是指针值,属于 prvalue;*this 才是 lvalue)

结论:

三分类是 lvalue / xvalue / prvalue,glvalue 和 rvalue 是上层的两种组合视角。

相关推荐
lunar_coder4 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯5 小时前
C++进阶.多态
c++
2401_885885045 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅5 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
凯瑟琳.奥古斯特6 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun616 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖6 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
技术小甜甜7 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qz_Serene7 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节