我试图了解价值类别的差异,我发现了微软的这个文档。
- An xvalue is a glvalue that [...]
- An lvalue is a glvalue that is not an xvalue.
- An rvalue is a prvalue or an xvalue.
为什么是xvalue
a glvalue
?他们为什么不说An xvalue is an glvalue or an rvalue
?在我看来,这句话是故意表达的,但我不明白为什么
他们为什么不说一个 xvalue 是一个左值或右值?
因为 rvalue 尚未定义,并且因为 rvalue 将根据 xvalue 定义。必须在不依赖另一个的情况下定义一个,以避免定义变得循环。
也因为xvalue既是glvalue又是rvalue。
此外,xvalue 是一个非左值的左值。更进一步,xvalue 是一个不是纯右值的右值。最后,xvalue 是一个既不是左值也不是纯右值的表达式。
我不明白他们为什么在那句话中只提到 gvalues
只定义了 glvalue 和 prvalue。参见前面提到的避免循环定义。
什么是 C++ 中的 xvalues
好吧,你已经看到了它的定义。该标准具有以下非规范性注释,提供了更多信息:
[基本.lval]
[ 注意:表达式是一个 xvalue,如果它是:
- 调用函数的结果,无论是隐式还是显式,其返回类型是对对象类型 ([expr.call]) 的右值引用,
- 转换为对对象类型的右值引用 ([expr.type.conv], [expr.dynamic.cast], [expr.static.cast] [expr.reinterpret.cast], [expr.const.cast], [ expr.cast]),
- 具有 xvalue 数组操作数 ([expr.sub]) 的下标操作,
- 一个类成员访问表达式,指定一个非引用类型的非静态数据成员,其中对象表达式是一个 xvalue ([expr.ref]),或者
- 一个 .* 指向成员的表达式,其中第一个操作数是一个 xvalue,第二个操作数是一个指向数据成员的指针 ([expr.mptr.oper])。
该图可能具有误导性。
有左值,xvalues和prvalues。它们是唯一且完整的,即每个表达式都恰好是以下之一:lvalue、xvalue 或 prvalue。
lvalues 和 xvalues 统称为 glvalues
xvalues 和 prvalues 统称为 rvalues
所以xvalues既是glvalues又是rvalues。