#include <utility>
#include <iostream>
template<class T>
T& assign(T& t1, const T& t2)
{
void* ptr = &t1;
t1.~T();
return *new(ptr) T(t2);
}
int main()
{
int i = 0;
auto l1 = [=](int v) mutable { if(!i) i = v; std::cout << "\ni = " << i ; };
auto l2(l1);
l1(1);
l2(2);
std::cout << "\nassign:";
assign(l1, l2);
l1(1);
l2(2);
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPGNsYXNzIFQ+ClQmIGFzc2lnbihUJiB0MSwgY29uc3QgVCYgdDIpCnsKICAgIHZvaWQqIHB0ciA9ICZ0MTsKICAgIHQxLn5UKCk7CiAgICByZXR1cm4gKm5ldyhwdHIpIFQodDIpOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBpID0gMDsKICAgIGF1dG8gbDEgPSBbPV0oaW50IHYpIG11dGFibGUgeyBpZighaSkgaSA9IHY7IHN0ZDo6Y291dCA8PCAiXG5pID0gIiA8PCBpIDsgfTsKICAgIGF1dG8gbDIobDEpOwogICAgbDEoMSk7CiAgICBsMigyKTsKICAgIHN0ZDo6Y291dCA8PCAiXG5hc3NpZ246IjsKICAgIGFzc2lnbihsMSwgbDIpOwogICAgbDEoMSk7CiAgICBsMigyKTsKfQo=