为什么递增并分配给引用,而不是更改值?

Aar*_*rsh 2 c++ reference

我无法理解,为什么代码的输出不是我所期望的。

#include <iostream>
using namespace std;
int main()
{
    int m = 2, n = 6;
    int &x = m;
    int &y = n;
    m = x++; 
    x = m++;
    n = y++;
    y = n++;
    cout<< m << " " << n; 
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

我期待 4 8

cig*_*ien 6

这一行:

m = x++; 
Run Code Online (Sandbox Code Playgroud)

相当于:

x = x++;
Run Code Online (Sandbox Code Playgroud)

因为m是对x.

从 c++17 开始,首先计算右侧,结果为 2。然后x递增为 3。然后将右侧值分配给左侧。但这使用了右手边的旧值,即 2。所以上面的语句实际上什么也没做。

在 C++17 之前,

m = x++;
Run Code Online (Sandbox Code Playgroud)

是未定义的行为。