#include <iostream>
#include <functional>
class foo
{
public:
void visitWith(const std::function<void(foo&)> &v) { v(*this); };
void visitWith(const std::function<void(const foo&)> &v) const { v(*this); };
};
class bar {
foo *f = new foo;
public:
void visitFoosWith(const std::function<void(const foo&)>& v) const {
f->visitWith(v); // Visual C++ doesn't like this
}
};
int main()
{
bar b;
b.visitFoosWith([&](const foo&){ std::cout << "visited a const foo!" << std::endl; });
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIGZvbwp7CnB1YmxpYzoKCXZvaWQgdmlzaXRXaXRoKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChmb28mKT4gJnYpIHsgdigqdGhpcyk7IH07Cgl2b2lkIHZpc2l0V2l0aChjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgZm9vJik+ICZ2KSBjb25zdCB7IHYoKnRoaXMpOyB9Owp9OwpjbGFzcyBiYXIgewogIGZvbyAqZiA9IG5ldyBmb287CnB1YmxpYzoKICB2b2lkIHZpc2l0Rm9vc1dpdGgoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IGZvbyYpPiYgdikgY29uc3QgewogIAlmLT52aXNpdFdpdGgodik7ICAgLy8gVmlzdWFsIEMrKyBkb2Vzbid0IGxpa2UgdGhpcwogIH0KfTsKCmludCBtYWluKCkKewoJYmFyIGI7CgliLnZpc2l0Rm9vc1dpdGgoWyZdKGNvbnN0IGZvbyYpeyBzdGQ6OmNvdXQgPDwgInZpc2l0ZWQgYSBjb25zdCBmb28hIiA8PCBzdGQ6OmVuZGw7IH0pOwoJcmV0dXJuIDA7Cn0K