我应该采取什么步骤来确定表达式的值类别?

时间:2019-05-30 18:51:47

标签: c++11 rvalue xvalue value-categories prvalue

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

1 个答案:

答案 0 :(得分:1)

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

  • 如果它是函数或已经存在的对象,则为glvalue。
    • 大多数glvalues是左值。
    • xvalues是可以专门从以下位置移动的东西:转换为右值引用类型,或者函数调用,其中函数返回类型是右值引用类型(尤其是std::move有时 std::forward)。
  • 如果它只是值或创建新对象的方式,那么它就是prvalue。

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

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

  1. 根据语法确定您拥有哪种表达方式。一个字面意思?运算符表达式?一个lambda?等等

  2. 如果表达式是运算符表达式,请找出重载解析是否会选择某些重载的运算符函数或内置的候选运算符,如[over.match.oper][over.oper]和{ {3}}。

  3. 如果表达式实际上是对重载运算符的调用,则值类别由重载解析选择的运算符的返回类型确定,如[over.built]中所述。在这种情况下,请为此忽略内置操作员行为的描述。

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