对左值执行算术运算

Performing arithmetic operations on lvalue

本文关键字:算术运算 执行      更新时间:2023-10-16

我知道以下C++表达式

j * 4 = 7; // C2106

不正确,因为左侧应有一个左值。

如果我猜对了,变量 j 实际上是一个左值,但执行算术运算j * 4产生右值。因此,对不对说执行算术运算,例如对左值进行加法将总是产生右值

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

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

内置

运算符+(一元和二进制(、-(一元和二进制(、*(二进制(、/%<<>>产生 prvalue("纯"右值(,无一例外。(其他各种运算符也是如此,您可能不会将其视为算术运算符。此外,它们都要求其操作数是 prvalue,因此如果它们最初是左值,它们将经历隐式的右值到右值的转换。

您可能知道内置复合赋值运算符会产生左值。一个鲜为人知的事实是,内置的预递增和前递减运算符也会产生左值。因此,也许它们是您的假设的反例,即算术运算总是产生右值。

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

因此,是否可以说执行算术运算(如对左值加法(总是将其更改为右值?

是的。编辑:其实不然。查看其他答案。