我对确定表达式的值类别感到很困惑。您能否提供确定表达式的值类别应采取的基本步骤(应分析什么)?
问问题
100 次
1 回答
1
如果您只想要一个快速且通常正确的答案,请考虑以下经验法则:
- 如果它是一个函数或一个已经存在的对象,那么它就是一个glvalue。
- 大多数glvalues是左值。
- xvalues 是可以特别移动的东西:强制转换为右值引用类型,或者函数返回类型是右值引用类型的函数调用(尤其是
std::move
有时)std::forward
。
- 如果它只是一个值或一种创建新对象的方式,那么它就是一个纯右值。
但在某些情况下,类别可能仍不清楚。A.B
并且上面涉及到一些简化(特别是和的规则A ? B : C
更复杂)。
唯一真正可靠的方法是在标准中寻找答案。
确定你在语法方面的表达方式。字面意思?运算符表达式?一个拉姆达?等等。
如果表达式是运算符表达式,请确定重载决策是否会选择某些重载运算符函数或内置候选运算符,如[over.match.oper]、[over.oper]和[over.built]中所述.
如果表达式实际上是对重载运算符函数的调用,则值类别由重载决议选择的运算符函数的返回类型确定,如[expr.call]中所述。在这种情况下,请忽略为此目的的内置运算符行为的描述。
否则,查找表达式的语法形式的 [expr.prim] 或 [expr.compound] 部分(参见目录)。该部分将说明如何确定表达式的值类别。通常需要知道任何子表达式的类型和值类别,因此您可能需要递归地遵循这些规则。
于 2019-05-30T21:26:39.887 回答