I think the only way to make this really safe to use is to require the called constructor to be noexcept
, for example by adding a static_assert
:
static_assert(noexcept(T(22, Brown, true)), "The constructor must be noexcept for inplace reconstruction");
T x(31, Blue, false);
x.~T();
::new (&x) T(22, Brown, true);
Of course this will only work for C++11.