我试图了解价值类别的差异,我发现了微软的这个文档。
- An xvalue is a glvalue that [...]
- An lvalue is a glvalue that is not an xvalue.
- An rvalue is a prvalue or an xvalue.
为什么是xvaluea 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。