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 是上层的两种组合视角。

相关推荐
starzy19902 小时前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
布莱克6052 小时前
Swift 条件语句详解:从 if 到 switch 的完整指南
开发语言·ssh·swift·switch·条件语句·guard·if
汉克老师3 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
吴可可1233 小时前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.9924 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime4 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven4 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981034 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
总要学点什么4 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium