#include <utility>
#include <new>

using std::move;

template <typename T>
class container
{
public:
    void add(T const & val)
    {
        obj_.~T();                  // ignore this shit
        new (&obj_) T{val};         // force to use cctor
    }

    void add(T && val)
    {
        obj_.~T();
        new (&obj_) T{move(val)};    // force to use mctor
    }

private:
    T obj_;
};

struct moveable
{
    moveable() = default;
    moveable(moveable const &) = delete;
    moveable(moveable &&) = default;
};

int main()
{
    container<moveable> c;
    c.add(moveable{});
}
