#include <iostream>
#include <functional>
using namespace std;
class A {
protected:
virtual int get() {
cout << "in A::get" << endl;
return 0;
}
public:
template<typename Function>
A(const Function & get_ptr) {
get_ptr(); // NOT get() !
}
};
class B : public A {
protected:
int get() override {
cout << "in B::get" << endl;
return 0;
}
public:
B() : A([=]{ B::get(); })
// ^^^^^^^^ this is undefined behavior, as `this` is not yet a B*!
{
}
};
int main() {
B b;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEEgewpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIGludCBnZXQoKSB7CiAgICAgICAgY291dCA8PCAiaW4gQTo6Z2V0IiA8PCBlbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQpwdWJsaWM6CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbj4KICAgIEEoY29uc3QgRnVuY3Rpb24gJiBnZXRfcHRyKSB7CiAgICAgICAgZ2V0X3B0cigpOyAgLy8gTk9UIGdldCgpICEKICAgIH0KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CnByb3RlY3RlZDoKICAgIGludCBnZXQoKSBvdmVycmlkZSB7CiAgICAgICAgY291dCA8PCAiaW4gQjo6Z2V0IiA8PCBlbmRsOwogICAgICAgIHJldHVybiAwOwogICAgfQpwdWJsaWM6CiAgICBCKCkgOiBBKFs9XXsgQjo6Z2V0KCk7IH0pCiAgICAvLyAgICAgICAgICAgXl5eXl5eXl4gIHRoaXMgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBhcyBgdGhpc2AgaXMgbm90IHlldCBhIEIqIQogICAgewogICAgfQp9OwoKaW50IG1haW4oKSB7CglCIGI7CglyZXR1cm4gMDsKfQ==