В соответствии со стандартом (§ 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
» к типу «указатель на Т2» (где T1
и T2
являются типами объектов, и где требование выравнивания T2
не является более жестким, чем у T1
) и обратно к его оригинальный тип дает исходное значение указателя. Результат любого другого преобразования указателя не задан.
Таким образом, мы могли бы сделать следующий вывод:
reinterpret_cast<*T>(ptr)
является eqiuvalent к static_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
не всегда равна ptr
, но reinterpret_cast<>(ptr)
всегда равна ptr
- если нет проблем с выравниванием, мы можем использовать
reinterpret_cast
безопасно
Я подозреваю, что это необходимо для правильной совместимости/стандартного соответствия, потому что результат 'reinterpret_cast' не указан в стандарте. На практике они, вероятно, делают то же самое во всех или почти во всех реализациях. –
Эти два эквивалента в C++ 11. – Simple
@SteveJessop: Я думаю, что это ответ. –