对左值执行算术运算

时间:2015-04-02 02:44:07

标签: c++

我理解以下C ++表达式

j * 4 = 7; // C2106

不正确,因为左侧需要左值。

如果我猜对了,那么变量 j 实际上是一个左值,但是正在执行 算术运算j * 4导致rvalue。因此,是对的 要说在左值上执行像加法这样的算术运算 总是会产生右值

如果是,此规则是否有例外?

注意:我们不要考虑这个问题的指针。

2 个答案:

答案 0 :(得分:4)

内置运算符+(一元和二元),-(一元和二元),*(二元),/%<<>>毫无例外地产生prvalues(“纯”rvalues)。 (各种其他运算符也是如此,你可能不会考虑算术运算。)此外,它们都需要它们的操作数是prvalues,所以如果它们最初是lvalues,它们会经历隐式的左值到右值的转换。

您可能已经意识到内置复合赋值运算符会产生左值。一个鲜为人知的事实是,内置的preincrement和precrement运算符也产生左值。所以也许他们反对你的假设,即算术运算总是导致rvalues。

如果重载运算符,则其返回类型的值类别可以是您想要的任何值。如果需要,您可以operator+返回T&,其中T是某类或枚举类型。然后,添加的结果可能是左值。但是很难想象什么时候编写这样的运算符是有意义的。

答案 1 :(得分:-2)

  

因此,如果执行像左值上的加法这样的算术运算总是会将其改为右值,这是正确的吗?

是。 编辑:实际上,没有。请参阅其他答案。