Abh*_*ane 4 c++ rvalue lvalue post-increment
代码
#include<iostream>
int main()
{
int a=3;
a++=5;
std::cout<<a;
}
Run Code Online (Sandbox Code Playgroud)
输出(如预期)
[Error] lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)
1.后增量运算符 ( a++) 在表中具有最高优先级。所以它肯定会在赋值运算符 ( =)之前执行。并且根据后增量规则,变量的值a只有在执行该语句后才会增加。
那么当后增量运算符 ( ++) 在赋值运算符 ( =)之前执行时究竟会发生什么?
2. 在C 中,前自增运算符和后自增运算符都产生右值,但C++将前自增运算符更新为左值,同时将后自增运算符仅保留为右值。原因是我们不能让它成为左值,因为它只有旧值,而不是更新的值。但我不能正确理解这个原因。
现在a++看到右值是 3,而不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?
并且根据后增量规则,变量 a 的值仅在执行该语句后才会增加。
这有点误导。变量立即递增。但表达式的结果是旧值。这应该更容易理解为什么它不能是左值。修改后的对象没有旧值,因此假设的左值不能引用该对象。该值是一个新的临时对象;它是一个纯右值。
打个比方,考虑编写一个与后增量做同样事情的函数。这就是它的编写方式(如果您为一个类定义了重载运算符重载,那么像这样的函数实际上就是您编写的一些更改的内容):
int post_increment(int& operand)
{
int old = operand;
operand += 1;
return old;
}
Run Code Online (Sandbox Code Playgroud)
您如何有意义地重写该函数以返回左值(引用)并仍然具有后增量预期的行为?