The first function returns an integer by-value, which is an r-value. You can't assign to an r-value in general. The second f() returns a reference to an integer, which is a l-value - so you can assign to it.
int a = 4, b = 5;
int& f() {return a;}
...
f() = 6;
// a is 6 now
Note: you don't assign a value to the function, you just assign to its return value.
Be careful with the following:
int& f() { int a = 4; return a; }
You're returning a reference to a temporary, which is no longer valid after the function returns. Accessing the reference invokes undefined behaviour.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…