#include <iostream>
#include <string>
#include <functional>
#include <memory>
class X
{
std::string m_s;
public:
X () { }
X (std::string s) { m_s = s; }
~X () { m_s = "destroyed"; std::cout << m_s << "\n"; }
X (const X&) = delete;
X& operator= (const X&) = delete;
X (X&& other) { m_s = other.m_s; other.m_s.clear (); }
X& operator= (X&& other) { m_s = other.m_s; other.m_s.clear (); return *this; };
inline void Print() const { std::cout << m_s << "\n"; }
};
void foo (std::shared_ptr <X> x) { x->Print (); }
int main()
{
std::function <void ()> f;
{
auto x = std::make_shared <X> ("Hello World!");
f = [=] () { foo (x); };
}
f ();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KCmNsYXNzIFgKewogICAgc3RkOjpzdHJpbmcgbV9zOwoKcHVibGljOgogICAgWCAoKSB7IH0KICAgIFggKHN0ZDo6c3RyaW5nIHMpIHsgbV9zID0gczsgfQogICAgflggKCkgeyBtX3MgPSAiZGVzdHJveWVkIjsgc3RkOjpjb3V0IDw8IG1fcyA8PCAiXG4iOyB9CiAgICBYIChjb25zdCBYJikgPSBkZWxldGU7CiAgICBYJiBvcGVyYXRvcj0gKGNvbnN0IFgmKSA9IGRlbGV0ZTsKICAgIFggKFgmJiBvdGhlcikgeyBtX3MgPSBvdGhlci5tX3M7IG90aGVyLm1fcy5jbGVhciAoKTsgfQogICAgWCYgb3BlcmF0b3I9IChYJiYgb3RoZXIpIHsgbV9zID0gb3RoZXIubV9zOyBvdGhlci5tX3MuY2xlYXIgKCk7IHJldHVybiAqdGhpczsgfTsKICAgIGlubGluZSB2b2lkIFByaW50KCkgY29uc3QgeyBzdGQ6OmNvdXQgPDwgbV9zIDw8ICJcbiI7IH0KfTsKCnZvaWQgZm9vIChzdGQ6OnNoYXJlZF9wdHIgPFg+IHgpIHsgeC0+UHJpbnQgKCk7IH0KCmludCBtYWluKCkKewogICAgc3RkOjpmdW5jdGlvbiA8dm9pZCAoKT4gZjsKCiAgICB7CiAgICAgICAgYXV0byB4ID0gc3RkOjptYWtlX3NoYXJlZCA8WD4gKCJIZWxsbyBXb3JsZCEiKTsKICAgICAgICBmID0gWz1dICgpIHsgZm9vICh4KTsgfTsKICAgIH0KCiAgICBmICgpOwp9Cg==