#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);
}
