#include <iostream>
#include <memory>
class ExampleImpl {
public:
ExampleImpl() {
std::cout << "constructor called" << std::endl;
}
~ExampleImpl() {
std::cout << "destructor called" << std::endl;
}
};
class Example {
std::shared_ptr<ExampleImpl> impl;
public:
Example() : impl(std::make_shared<ExampleImpl>()){}
Example* operator&() {
return new Example(*this);
}
};
int main() {
Example* example_pointer;
{
Example example; // prints "constructor called"
example_pointer = &example;
} // example still exists here, nothing is printed
std::cout << "Still exists here\n";
delete example_pointer; // deleting automatic variable manually
// Prints "destructor called"
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgRXhhbXBsZUltcGwgewpwdWJsaWM6CiAgICBFeGFtcGxlSW1wbCgpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNvbnN0cnVjdG9yIGNhbGxlZCIgPDwgc3RkOjplbmRsOwogICAgfQogICAgfkV4YW1wbGVJbXBsKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiZGVzdHJ1Y3RvciBjYWxsZWQiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmNsYXNzIEV4YW1wbGUgewogICAgc3RkOjpzaGFyZWRfcHRyPEV4YW1wbGVJbXBsPiBpbXBsOwpwdWJsaWM6CiAgICBFeGFtcGxlKCkgOiBpbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8RXhhbXBsZUltcGw+KCkpe30KICAgIEV4YW1wbGUqIG9wZXJhdG9yJigpIHsgCiAgICAgICAgcmV0dXJuIG5ldyBFeGFtcGxlKCp0aGlzKTsgCiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIEV4YW1wbGUqIGV4YW1wbGVfcG9pbnRlcjsKCiAgICB7CiAgICAgICAgRXhhbXBsZSBleGFtcGxlOyAvLyBwcmludHMgImNvbnN0cnVjdG9yIGNhbGxlZCIKICAgICAgICBleGFtcGxlX3BvaW50ZXIgPSAmZXhhbXBsZTsKICAgIH0gLy8gZXhhbXBsZSBzdGlsbCBleGlzdHMgaGVyZSwgbm90aGluZyBpcyBwcmludGVkCiAgICBzdGQ6OmNvdXQgPDwgIlN0aWxsIGV4aXN0cyBoZXJlXG4iOwoKICAgIGRlbGV0ZSBleGFtcGxlX3BvaW50ZXI7IC8vIGRlbGV0aW5nIGF1dG9tYXRpYyB2YXJpYWJsZSBtYW51YWxseQogICAgLy8gUHJpbnRzICJkZXN0cnVjdG9yIGNhbGxlZCIKCiAgICByZXR1cm4gMDsKfQo=