我对确定表达式的值类别感到困惑。您能否提供确定表达式值类别应采取的基本步骤(应进行哪些分析)?
答案 0 :(得分:1)
如果您只想获得快速且通常正确的答案,请考虑以下经验法则:
std::move
和有时 std::forward
)。但是在某些情况下,类别仍然可能不清楚。并且上面涉及一些简化(特别是A.B
和A ? B : C
的规则更复杂)。
唯一真正可靠的方法是在标准中寻找答案。
根据语法确定您拥有哪种表达方式。一个字面意思?运算符表达式?一个lambda?等等
如果表达式是运算符表达式,请找出重载解析是否会选择某些重载的运算符函数或内置的候选运算符,如[over.match.oper],[over.oper]和{ {3}}。
如果表达式实际上是对重载运算符的调用,则值类别由重载解析选择的运算符的返回类型确定,如[over.built]中所述。在这种情况下,请为此忽略内置操作员行为的描述。
否则,找到[expr.prim]或[expr.compound]的部分(请参见[expr.call])以获取表达式的语法形式。该部分将说明如何确定表达式的值类别。经常需要知道任何子表达式的类型和值类别,因此您可能需要递归地遵循这些规则。