为什么 a++(post-增量运算符)不能是左值?

Why can't a++ (post-increment operator) be an Lvalue?

代码

#include<iostream>
int main()
{
    int a=3;
    a++=5;
    std::cout<<a;
}

输出(符合预期)

[Error] lvalue required as left operand of assignment

1. post 增量运算符 (a++) 在 table 中具有最高优先级。所以肯定会在赋值运算符(=)之前执行。并且根据 post 递增的规则,变量 a 的值只会在执行该语句后递增。

那么当 post 增量运算符 (++) 时究竟发生了什么 在赋值运算符 (=)?

之前执行

2.C 中,预增量运算符和 post 增量运算符都会产生右值,但 C++ 将预增量运算符更新为左值,同时保持post-增量运算符仅作为右值。这样做的原因是我们不能使它成为左值,因为它只拥有旧值,而不是更新后的值。但是我不太理解这个原因。

现在看到 a++ 有右值 3,不是变量本身,对吧?但是如果它带来一个拥有左值的变量,那么 5 将插入其中,并且在语句结束后它的值将是 6。这有什么问题,为什么不能这样做?

And As per rule of post increment the value of variable a will increment only after execution of that statement.

这有点误导。变量立即递增。但是表达式的结果是旧值。这应该更容易理解为什么它不能是左值。修改后的对象没有旧值,因此假设的左值不能引用该对象。该值是一个新的临时对象;它是一个纯右值。

作为一个类比,考虑编写一个与 post 增量相同的函数。这就是它的编写方式(如果您为 class 定义重载运算符重载,那么像这样的函数实际上就是您要编写的内容,只需进行一些更改):

int post_increment(int& operand)
{
    int old = operand;
    operand += 1;
    return old;
}

您如何才能将该函数有意义地重写为 return 一个左值(参考)并且仍然具有 post 增量所期望的行为?