To use returned object from functions, could anyone tell me why case 1, 3, 4 are OK but not 2 in this code?
#include <iostream>
using namespace std;
class X {
    int i;
public:
    X(int ii = 0) : i(ii) {};
    void modify() { i++; };
};
X f1() { return X(1); }
// Pass by non-const reference
void f20(X& x) { x.modify(); }
// Pass by const reference
void f21(const X& x) { }
// Pass by value
void f22(X x) { x.modify(); }
int main() {
    f1() = X(2); // 1. OK
    //! f20(f1());   // 2. Bad
    f21(f1());   // 3. OK
    f22(f1());   // 4. OK
}
Thank you!
 
     
    