static_cast<derived*>(
::new (&something) base{ref})
недопустимо, по определению new (...) base(...)
создает объект base
в качестве нового завершенного объекта, который иногда может рассматриваться как существующий завершенный объект или член подобъект (в условиях, которые неbase
в любом случае), но никогда не является базовым подобъектом.
Не существует существующего правила , в котором говорится, что вы можете притворяться, что new (addr) base
создает действительный производный объект только потому, что base
объект перезаписывает другой base
базовый подобъект.Если ранее был объект derived
, вы просто повторно использовали хранилище с new (addr) base
.Даже если по какой-то магии объект derived
все еще существует, результат вычисления нового выражения не будет указывать на него, он будет указывать на base
завершенный объект.
Если выЕсли вы хотите притвориться, что вы что-то сделали (например, создали объект derived
), фактически не делая этого (вызывая конструктор derived
), вы можете добавить некоторые указатели volatile
на указатели, чтобы заставить компилятор стереть все предположения о значениях искомпилируйте код, как если бы произошел переход ABI.