#include <iostream>
using namespace std;
class foo {
public :
int A( ) const { // const function
return m_var;
}
int const B( ) { // non const function, but const return type
return m_var;
}
int const & C( ) const { // non const function, but const reference return type
return m_var;
}
private :
int m_var;
} ;
int main( ) {
const foo x{ } ;
x.A ( ) ; // ok
//x.B(); // not ok -> function B() doesn't guarantee to leave x unchanged.
x.C ( ) ; // ok
const int & y = x.C ( ) ; // ok (y will not alter m_var.
int & z = x.C ( ) ; // not ok since z is not const
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBmb28gewpwdWJsaWM6CglpbnQgQSgpIGNvbnN0IHsgICAvLyBjb25zdCBmdW5jdGlvbgogICAgCXJldHVybiBtX3ZhcjsgCgl9CglpbnQgY29uc3QgQigpIHsgICAvLyBub24gY29uc3QgZnVuY3Rpb24sIGJ1dCBjb25zdCByZXR1cm4gdHlwZQogICAgCXJldHVybiBtX3ZhcjsgCgl9CglpbnQgY29uc3QmIEMoKSBjb25zdCB7ICAgLy8gbm9uIGNvbnN0IGZ1bmN0aW9uLCBidXQgY29uc3QgcmVmZXJlbmNlIHJldHVybiB0eXBlCiAgICAJcmV0dXJuIG1fdmFyOyAKCX0KcHJpdmF0ZToKCWludCBtX3ZhcjsgCn07CgppbnQgbWFpbigpIHsKCWNvbnN0IGZvbyB4e307IAoJeC5BKCk7ICAgICAgICAgICAgICAgIC8vIG9rIAoJLy94LkIoKTsgICAgICAgICAgICAgIC8vIG5vdCBvayAtPiBmdW5jdGlvbiBCKCkgZG9lc24ndCBndWFyYW50ZWUgdG8gbGVhdmUgeCB1bmNoYW5nZWQuIAoJeC5DKCk7ICAgICAgICAgICAgICAgIC8vIG9rIAogICAgY29uc3QgaW50JiB5ID0geC5DKCk7IC8vIG9rICAoeSB3aWxsIG5vdCBhbHRlciBtX3Zhci4gCiAgICBpbnQmIHogPSB4LkMoKTsgICAgICAgLy8gbm90IG9rIHNpbmNlIHogaXMgbm90IGNvbnN0IAoJcmV0dXJuIDA7Cn0=