#include <vector>
//Declare Original out so View can use its copy/move constructor
class Original
{
public:
auto columns();
const auto columns() const;
std::vector<int> m;
};
//Full declaration/implementation of View
class View
{
public:
View(const Original &that) : m(that) { }
Original m;
};
//Now that View's constructors are defined, implement these Original funcs
auto Original::columns() {return View(*this);}
const auto Original::columns() const {return View(*this);} // comment #1
int main()
{
Original o1;
const Original o2;
o2.columns(); // comment #2
}
I2luY2x1ZGUgPHZlY3Rvcj4KCi8vRGVjbGFyZSBPcmlnaW5hbCBvdXQgc28gVmlldyBjYW4gdXNlIGl0cyBjb3B5L21vdmUgY29uc3RydWN0b3IKY2xhc3MgT3JpZ2luYWwKewpwdWJsaWM6CiAgICBhdXRvIGNvbHVtbnMoKTsKICAgIGNvbnN0IGF1dG8gY29sdW1ucygpIGNvbnN0OwogICAgc3RkOjp2ZWN0b3I8aW50PiBtOwp9OwoKLy9GdWxsIGRlY2xhcmF0aW9uL2ltcGxlbWVudGF0aW9uIG9mIFZpZXcKY2xhc3MgVmlldwp7CnB1YmxpYzoKICAgIFZpZXcoY29uc3QgT3JpZ2luYWwgJnRoYXQpIDogbSh0aGF0KSB7IH0KICAgIE9yaWdpbmFsIG07Cn07CgovL05vdyB0aGF0IFZpZXcncyBjb25zdHJ1Y3RvcnMgYXJlIGRlZmluZWQsIGltcGxlbWVudCB0aGVzZSBPcmlnaW5hbCBmdW5jcwphdXRvIE9yaWdpbmFsOjpjb2x1bW5zKCkge3JldHVybiBWaWV3KCp0aGlzKTt9CmNvbnN0IGF1dG8gT3JpZ2luYWw6OmNvbHVtbnMoKSBjb25zdCB7cmV0dXJuIFZpZXcoKnRoaXMpO30gLy8gY29tbWVudCAjMQoKaW50IG1haW4oKQp7CiAgICBPcmlnaW5hbCBvMTsKICAgIGNvbnN0IE9yaWdpbmFsIG8yOwogICAgbzIuY29sdW1ucygpOyAvLyBjb21tZW50ICMyCn0=