C++表达式值类别定义演进及相关技术问题咨询
问题1:符号表示的含义
这里是典型的指称语义类型签名,其中Environment指代程序运行的当前全局状态(包括已分配内存地址、对象生命周期状态、变量取值等所有上下文信息),Location指代内存中对象、位域或函数的唯一位置标识(可简单理解为内存地址):
glvalue :: Environment -> (Environment, Location):glvalue表达式的求值过程以当前程序状态为输入,输出更新后的程序状态(多数纯求值场景下状态无变化),以及对应实体的位置标识,符合「glvalue生成位置」的核心定义。prvalue :: (Environment, Location) -> Environment:prvalue表达式本身不会主动生成位置,它需要接收一个外部给定的目标位置和当前程序状态作为输入,执行目标位置的初始化操作后输出更新后的程序状态,符合「prvalue执行初始化」的核心定义。
问题2:C++17标准下X{4}.n不属于prvalue的判定依据
C++17标准对值类别的核心判定规则是:
- glvalue的核心作用是确定实体的标识(位置)
- prvalue的核心作用是执行初始化或计算操作数取值
对X{4}.n表达式而言:
- 成员访问运算符
.要求左操作数必须是glvalue,因此X{4}这个prvalue会先触发临时对象物化,转换为指向临时X对象的xvalue(属于glvalue) - 成员访问的结果是临时X对象中
n成员的位置标识,完全符合glvalue的定义 - 该表达式的求值结果是给出
n的位置,而非用于初始化另一个对象,因此不符合prvalue的定义,实际分类为xvalue(属于glvalue的子类)。
问题3:C++11标准下X{4}.n不属于prvalue的判定依据
C++11标准对值类别的核心判定规则是:
- prvalue是不属于xvalue的rvalue
- xvalue是指向生命周期末尾对象的表达式
对X{4}.n表达式而言:
- 它是临时对象
X{4}的子对象,所属的完整临时对象处于生命周期即将结束的状态 - 该表达式指向这个处于生命周期末尾的子对象,符合xvalue的定义
- 由于prvalue仅包含rvalue中不属于xvalue的部分,因此该表达式属于xvalue,不属于prvalue。
内容的提问来源于stack exchange,提问作者Géry Ogam
相关产品推荐
相关产品推荐

