【问题标题】:What are xvalues in C++什么是 C++ 中的 xvalues
【发布时间】:2019-11-05 01:14:32
【问题描述】:

我试图了解价值类别的差异,我发现了微软的this document

- An xvalue is a glvalue that [...]
- An lvalue is a glvalue that is not an xvalue.
- An rvalue is a prvalue or an xvalue.

为什么xvalueglvalue?他们为什么不说An xvalue is an glvalue or an rvalue?在我看来,这个措辞是故意表达的,但我不明白为什么

【问题讨论】:

  • @ShadowRanger 这不是重复的,抱歉
  • 这是 xvalue 的 the same wording on cppreference
  • 基本类别是左值,xvalue,prvalue,它们是互斥的。 “glvalue”和“rvalue”类别是统称。您建议的更改将意味着所有 glvalues 都是 xvalues(这是不正确的 - 实际上所有 xvalues 都是 glvalues 但反之亦然)
  • 该图试图说明glvalue = lvalue + xvaluervalue = xvalue + prvalue。有可能同时是glvaluexvaluervalue。如果您将该图误认为是维恩图并得出结论认为glvaluervalue 框之间没有重叠意味着它们是互斥的,这可能会产生误导。
  • 它的措辞可能是这样的,因为创建 xvalues 背后的全部动机是为了移动语义。

标签: c++ c++17 xvalue


【解决方案1】:

他们为什么不说一个 xvalue 是一个左值还是一个右值?

因为 rvalue 尚未定义,并且 rvalue 将根据 xvalue 定义。必须定义一个而不依赖另一个,以避免定义变得循环。

还因为 xvalue 既是左值又是右值。

此外,xvalue 是一个非左值的左值。更进一步,xvalue 是一个不是纯右值的右值。最后,xvalue 是一个既不是左值也不是纯右值的表达式。

我不明白他们为什么在那句话中只提到gvalues

仅定义了 glvalue 和 prvalue。请参阅前面提到的避免循环定义。

什么是 C++ 中的 xvalues

嗯,你已经看到了它的定义。该标准具有以下非规范性注释,提供了更多信息:

[basic.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])。

【讨论】:

  • 这是一个很好的解释!感谢您和其他评论者。
【解决方案2】:

该图可能具有误导性。

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

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

所以xvalues既是glvalues又是rvalues。

【讨论】:

  • 所以你的意思是下图更容易误导?它指出左值具有标识但不可移动,这意味着它可以是左值或 xvalue。 docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/…
  • @DanielStephens 该图非常好。左值具有标识(是左值)但不可移动(不是右值)。我不明白你的结论“它可以是左值或 xvalue”。
  • glvalues 有标识。右值可以移动。一个 xvalue 具有标识并且是可移动的(它位于两者的交点处)。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多