/* constReturnValues.cpp  --  compiler used: gnu g++ */
#include <iostream>

class X {
  int i;
public:
  X(int ii = 0);
  void modify();
};


X::X(int ii) { i = ii; }


void X::modify() { i++; }



X f5() {
  return X();
}


const X f6() {
  return X();
}


void f7(X& x) {         // Pass by non-const reference
  x.modify();
}


int main() {
  f5() = X(1);          // OK -- non-const return value
  f5().modify();        // OK
// f7(f5());            // Causes error:
                        //  constReturnValues.cpp:36: from rvalue of type `X'
                        //  constReturnValues.cpp:28: in passing argument 1 of `f7(X &)'

  // Causes compile-time errors:
// f6() = X(1);         // Causes error:
                        //  constReturnValues.cpp:41: passing `const X' as `this' argument
                        //  of `class X & X::operator =(const X &)' discards qualifiers
// f6().modify();       // Causes error:
                        //  constReturnValues.cpp: In function `int main()':
                        //  constReturnValues.cpp:44: passing `const X' as `this' argument
                        //  of `void X::modify()' discards qualifiers

// f7(f6());            // Causes error:
                        //  constReturnValues.cpp: In function `int main()':
                        //  constReturnValues.cpp:49: initialization of non-const reference
                        //  type `class X &'
                        //  constReturnValues.cpp:49: from rvalue of type `X'
                        //  constReturnValues.cpp:28: in passing argument 1 of `f7(X &)'
  system("pause");
}
