Если конструктор T
выбрасывает вторую конструкцию, у вас проблема. Если вам нравятся переборы, проверьте это:
T x(31, Blue, false);
x.~T();
const volatile bool _ = true;
for(;_;){
try{
::new (&x) T(22, Brown, true);
break; // finally!
}catch(...){
continue; // until it works, dammit!
}
}
Он даже обеспечивает гарантию исключений!
На более серьезной ноте это все равно, что наступить на мину, зная, что она сработает, если вы пошевелите ногой ...
И на самом деле - это способ обойти неопределенное поведение двойного уничтожения здесь:
#include <cstdlib>
T x(31, Blue, false);
x.~T();
try{
::new (&x) T(22, Brown, true);
}catch(...){
std::exit(1); // doesn't call destructors of automatic objects
}