0

我对确定表达式的值类别感到很困惑。您能否提供确定表达式的值类别应采取的基本步骤(应分析什么)?

4

1 回答 1

1

如果您只想要一个快速且通常正确的答案,请考虑以下经验法则:

  • 如果它是一个函数或一个已经存在的对象,那么它就是一个glvalue。
    • 大多数glvalues是左值。
    • xvalues 是可以特别移动的东西:强制转换为右值引用类型,或者函数返回类型是右值引用类型的函数调用(尤其是std::move有时 std::forward
  • 如果它只是一个值或一种创建新对象的方式,那么它就是一个纯右值。

但在某些情况下,类别可能仍不清楚。A.B并且上面涉及到一些简化(特别是和的规则A ? B : C更复杂)。

唯一真正可靠的方法是在标准中寻找答案。

  1. 确定你在语法方面的表达方式。字面意思?运算符表达式?一个拉姆达?等等。

  2. 如果表达式是运算符表达式,请确定重载决策是否会选择某些重载运算符函数或内置候选运算符,如[over.match.oper][over.oper][over.built]中所述.

  3. 如果表达式实际上是对重载运算符函数的调用,则值类别由重载决议选择的运算符函数的返回类型确定,如[expr.call]中所述。在这种情况下,请忽略为此目的的内置运算符行为的描述。

  4. 否则,查找表达式的语法形式的 [expr.prim] 或 [expr.compound] 部分(参见目录)。该部分将说明如何确定表达式的值类别。通常需要知道任何子表达式的类型和值类别,因此您可能需要递归地遵循这些规则。

于 2019-05-30T21:26:39.887 回答