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
相关产品推荐
相关产品推荐

