Согласно этому сетевому черновому варианту C ++ , приведение от одного типа указателя к другому и затем обратно указывается условно:
5.2.10 Переосмыслить приведение
(7) Преобразование значения типа «указатель на T1» в тип «указатель»
в T2 ”(где T1 и T2 - типы объектов и где выравнивание
требования T2 не более строгие, чем требования T1) и обратно к
оригинальный тип возвращает исходное значение указателя.
Это означает, что приведение само по себе от int*
до Empty*
действительно до тех пор, пока Empty
не имеет более строгих требований к выравниванию, чем int
, и вы можете позже привести к int*
.
Обратите внимание, однако, что это не означает, что вы можете получить доступ / разыменовать объект Empty*
(так как это не объект Empty
, на который указывает указатель).
Таким образом, с чистым приведением все в порядке, но разыменование дает UB.