Ответ 1
Согласно стандарту (§ 5.2.10 reinterpret_cast
, раздел 7):
Указатель на объект может быть явно преобразован в указатель на отдельный тип объекта. Когда prvalue
v
типа "указатель наT1
" преобразуется в тип "указатель наcv T2
", результатstatic_cast<cv T2*>(static_cast<cv void*>(v))
, если обаT1
иT2
являются стандартными макетами типы и требования к выравниваниюT2
не более строгие, чем требованияT1
.Преобразование prvalue типа "указатель на
T1
" в тип "указатель на T2" (гдеT1
иT2
- это типы объектов, а требования к выравниваниюT2
не более строгие, чем требования кT1
) и обратно к исходному типу дает исходное значение указателя. Результат любого другого такого преобразования указателя не определен.
Итак, мы могли бы сделать следующий вывод:
-
reinterpret_cast<*T>(ptr)
является эквивалентным дляstatic_cast<*T>(static_cast<void*>(ptr))
-
static_cast<>(ptr)
не всегда равенptr
, ноreinterpret_cast<>(ptr)
всегда равенptr
- Если нет проблем с выравниванием, мы можем безопасно использовать
reinterpret_cast