我应该采取哪些步骤来确定表达式的值类别?
What steps should I take to determine the value category of an expression?
我对确定表达式的值类别感到很困惑。您能否提供应该采取的基本步骤(应该分析什么)来确定表达式的值类别?
如果您只是想要一个快速且通常正确的答案,请考虑以下经验法则:
- 如果它是一个函数或一个已经存在的对象,那么它就是一个左值。
- 大多数左值都是左值。
- xvalues 是可以明确移动的东西:转换为右值引用类型,或函数调用,其中函数 return 类型是右值引用类型(尤其是
std::move
和 有时 std::forward
).
- 如果它只是一个值或一种创建新对象的方法,那么它就是纯右值。
但在某些情况下,类别仍然不清楚。上面涉及一些简化(特别是 A.B
和 A ? B : C
的规则更复杂)。
唯一真正可靠的方法是在标准中寻找答案。
根据语法确定你的表达方式。文字?运算符表达式?拉姆达?等等
如果表达式是运算符表达式,请确定重载决策是否会 select 某些重载运算符函数或 built-in 候选运算符,如 [=14= 中所述].
如果表达式实际上是对重载运算符函数的调用,则值类别由运算符函数的 return 类型确定 select 通过重载解析,如 [expr.call] 中所述。在这种情况下,请忽略为此目的对 built-in 运算符行为的描述。
否则,找到[expr.prim]或[expr.compound]的部分(见table of contents)的语法形式。该部分将说明如何确定表达式的值类别。通常需要知道任何子表达式的类型和值类别,因此您可能需要递归地遵循这些规则。
我对确定表达式的值类别感到很困惑。您能否提供应该采取的基本步骤(应该分析什么)来确定表达式的值类别?
如果您只是想要一个快速且通常正确的答案,请考虑以下经验法则:
- 如果它是一个函数或一个已经存在的对象,那么它就是一个左值。
- 大多数左值都是左值。
- xvalues 是可以明确移动的东西:转换为右值引用类型,或函数调用,其中函数 return 类型是右值引用类型(尤其是
std::move
和 有时std::forward
).
- 如果它只是一个值或一种创建新对象的方法,那么它就是纯右值。
但在某些情况下,类别仍然不清楚。上面涉及一些简化(特别是 A.B
和 A ? B : C
的规则更复杂)。
唯一真正可靠的方法是在标准中寻找答案。
根据语法确定你的表达方式。文字?运算符表达式?拉姆达?等等
如果表达式是运算符表达式,请确定重载决策是否会 select 某些重载运算符函数或 built-in 候选运算符,如 [=14= 中所述].
如果表达式实际上是对重载运算符函数的调用,则值类别由运算符函数的 return 类型确定 select 通过重载解析,如 [expr.call] 中所述。在这种情况下,请忽略为此目的对 built-in 运算符行为的描述。
否则,找到[expr.prim]或[expr.compound]的部分(见table of contents)的语法形式。该部分将说明如何确定表达式的值类别。通常需要知道任何子表达式的类型和值类别,因此您可能需要递归地遵循这些规则。