#include <iostream>
using namespace std;
class bar {
public:
void change_it() {}
void read_it() const {}
};
class foo {
public:
bar A() const { // const function
return m_var;
}
bar const B() { // non const function, but const return type
return m_var;
}
bar const& C() const { // non const function, but const reference return type
return m_var;
}
//private:
bar 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 bar& y = x.C(); // ok (y will not alter m_var).
//int& z = x.C(); // not ok since z is not const
foo u{};
u.B(); // ok
u.B().read_it(); // ok
//u.B().change_it(); // not ok because of const return value.
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBiYXIgewpwdWJsaWM6IAogICAgdm9pZCBjaGFuZ2VfaXQoKSB7fSAgCiAgICB2b2lkIHJlYWRfaXQoKSBjb25zdCB7fSAKfTsgCmNsYXNzIGZvbyB7CnB1YmxpYzoKCWJhciBBKCkgY29uc3QgeyAgIC8vIGNvbnN0IGZ1bmN0aW9uCiAgICAJcmV0dXJuIG1fdmFyOyAKCX0KCWJhciBjb25zdCBCKCkgeyAgIC8vIG5vbiBjb25zdCBmdW5jdGlvbiwgYnV0IGNvbnN0IHJldHVybiB0eXBlCiAgICAJcmV0dXJuIG1fdmFyOyAKCX0KCWJhciBjb25zdCYgQygpIGNvbnN0IHsgICAvLyBub24gY29uc3QgZnVuY3Rpb24sIGJ1dCBjb25zdCByZWZlcmVuY2UgcmV0dXJuIHR5cGUKICAgIAlyZXR1cm4gbV92YXI7IAoJfQovL3ByaXZhdGU6CgliYXIgbV92YXI7IAp9OwoKaW50IG1haW4oKSB7Cgljb25zdCBmb28geHt9OyAKCXguQSgpOyAgICAgICAgICAgICAgICAvLyBvayAKCS8veC5CKCk7ICAgICAgICAgICAgICAvLyBub3Qgb2sgLT4gZnVuY3Rpb24gQigpIGRvZXNuJ3QgZ3VhcmFudGVlIHRvIGxlYXZlIHggdW5jaGFuZ2VkLiAKCXguQygpOyAgICAgICAgICAgICAgICAvLyBvayAKICAgIGNvbnN0IGJhciYgeSA9IHguQygpOyAvLyBvayAgKHkgd2lsbCBub3QgYWx0ZXIgbV92YXIpLgogICAgLy9pbnQmIHogPSB4LkMoKTsgICAgICAgLy8gbm90IG9rIHNpbmNlIHogaXMgbm90IGNvbnN0IAogICAgCiAgICBmb28gdXt9OyAKICAgIHUuQigpOyAgICAgICAgICAgICAgICAvLyBvayAKICAgIHUuQigpLnJlYWRfaXQoKTsgICAgICAvLyBvawogICAgLy91LkIoKS5jaGFuZ2VfaXQoKTsgICAgLy8gbm90IG9rIGJlY2F1c2Ugb2YgY29uc3QgcmV0dXJuIHZhbHVlLiAgCgoJcmV0dXJuIDA7Cn0=