3

我试图了解价值类别的差异,我发现了微软的这个文档

在此处输入图像描述

- 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?在我看来,这句话是故意表达的,但我不明白为什么

4

2 回答 2

2

他们为什么不说一个 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])。
于 2019-11-05T01:52:23.983 回答
1

该图可能具有误导性。

有左值,xvalues和prvalues。它们是唯一且完整的,即每个表达式都恰好是以下之一:lvalue、xvalue 或 prvalue。

lvalues 和 xvalues 统称为 glvalues
xvalues 和 prvalues 统称为 rvalues

所以xvalues既是glvalues又是rvalues。

于 2019-11-05T01:37:27.350 回答