You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++表达式值类别判定代码结果存疑,求原理及正确判定方式

C++表达式值类别判定解析

判定代码的正确性

你使用的这段值类别判定代码是正确的,不符合预期的是你的认知,而非代码逻辑。下面逐个分析测试用例:

1. rf()的结果:lvalue(而非预期的prvalue)

返回int&的函数调用表达式属于左值(lvalue)。原因是:

  • prvalue(纯右值)是无身份标识的临时值,而返回左值引用的函数调用,本质是返回一个已有身份的对象的别名,该表达式支持取地址操作,符合左值的核心特征——具有身份且不可被隐式移动。

2. S{}.rval的结果:lvalue(而非预期的xvalue)

访问临时对象S{}的引用类型成员rval,结果是左值,而非xvalue。原理如下:

  • 引用本身不是对象,只是某个对象的别名。当访问S{}.rval时,该表达式等价于直接访问它绑定的对象S{}.val,但因为是通过引用类型的成员访问,表达式的值类别是被引用对象的左值,而非临时对象成员对应的xvalue。
  • 根据C++标准,xvalue是“具有身份且可被移动的表达式”,比如直接访问临时对象的非引用成员(如S{}.val)属于xvalue,但访问引用类型成员时,表达式结果是引用绑定对象的左值,不满足xvalue的判定规则。

补充:S{}.val为何是xvalue

临时对象S{}是prvalue,访问它的非引用成员val时,该表达式属于“临时对象的成员”,既具备身份(是临时对象的一部分),又可被移动,因此被判定为xvalue。


内容的提问来源于stack exchange,提问作者Oersted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:22:40