前提:
C++11标准将表达式分类为三种不相交的值类别:左值(lvalues)、右值引用(xvalues)和纯右值(prvalues)(§3.10/1)。可以在此处找到有关值类别的解释,例如这里。
我正在努力弄清楚不同运算符对其操作数的值类别的要求是什么。第3.10/1段规定:
[...]每个表达式都属于此分类法中的一种基本分类,即左值、右值引用或纯右值。表达式的这个属性称为其值类别。(注:在第5条款中,每个内置运算符的讨论都指出了它产生的值的类别以及它所期望的操作数的值类别。例如,内置赋值运算符期望左操作数为左值,右操作数为纯右值,产生一个左值作为结果。用户定义的运算符是函数,它们期望和产生的值的类别由它们的参数和返回类型确定。—结束注释]。
尽管上面的注释声称,第5条款并不总是非常清楚运算符操作数的值类别。例如,下面是关于赋值运算符操作数的值类别所说的全部内容(第5.17/1段):
赋值运算符(=)和复合赋值运算符都是从右向左结合的。它们都需要一个可修改的左值作为左操作数,并返回引用左操作数的左值。
如果左操作数是位域,则所有情况下的结果都是位域。在所有情况下,赋值在右操作数和左操作数的值计算之后进行,赋值表达式的值计算之前进行。关于不确定顺序的函数调用,在复合赋值的操作中,是单个评估。注意:因此,函数调用不能介入左值到右值转换和任何单个复合赋值运算符相关的副作用之间。 - 结束注释
那右操作数呢?
在整个第5.17节中,不再出现“rvalue”和“lvalue”这两个词。虽然第3.10 / 1段的注释明确说明内置的赋值运算符期望prvalue作为右操作数,但这在第5.17节中没有明确提到。甚至最后一条注释5.17 / 1也提到了左值到右值的转换,似乎暗示着某种程度上期望rvalue(否则没有必要进行转换),但毕竟注释都是非规范性的。
涉及其他运算符的章节,包括乘法运算符和加法运算符,通常对其操作数的值类别保持沉默。我找不到标准中任何“默认语句”,说明当未另行指定时,内置运算符的操作数是rvalue。因此,这个问题。
问题:
- 赋值运算符右操作数的值类别是什么;更一般地说
- 在没有规定操作数的值类别时,如何确定运算符的操作数的值类别?它是无约束的(意味着接受任何值类别)吗?如果是这样,为什么左值到右值的转换会应用于赋值表达式?
非常感谢您提供C++11标准的参考。
T&operator =(T)
同样适用。不是吗? - Andy Prowl