我理解以下C ++表达式
j * 4 = 7; // C2106
不正确,因为左侧需要左值。
如果我猜对了,那么变量 j 实际上是一个左值,但是正在执行
算术运算j * 4
导致rvalue。因此,是对的
要说在左值上执行像加法这样的算术运算
总是会产生右值?
如果是,此规则是否有例外?
注意:我们不要考虑这个问题的指针。
答案 0 :(得分:4)
内置运算符+
(一元和二元),-
(一元和二元),*
(二元),/
,%
,<<
和>>
毫无例外地产生prvalues(“纯”rvalues)。 (各种其他运算符也是如此,你可能不会考虑算术运算。)此外,它们都需要它们的操作数是prvalues,所以如果它们最初是lvalues,它们会经历隐式的左值到右值的转换。
您可能已经意识到内置复合赋值运算符会产生左值。一个鲜为人知的事实是,内置的preincrement和precrement运算符也产生左值。所以也许他们反对你的假设,即算术运算总是导致rvalues。
如果重载运算符,则其返回类型的值类别可以是您想要的任何值。如果需要,您可以operator+
返回T&
,其中T
是某类或枚举类型。然后,添加的结果可能是左值。但是很难想象什么时候编写这样的运算符是有意义的。
答案 1 :(得分:-2)
因此,如果执行像左值上的加法这样的算术运算总是会将其改为右值,这是正确的吗?
是。 编辑:实际上,没有。请参阅其他答案。