Я хочу знать, есть ли конкретные, основанные на стандартах различия между двумя разными типами приведений очень конкретных типов. В частности, задано: type T
и переменная T * object
:
intptr_t opaque = reinterpret_cast<intptr_t>( object );
T * result = reinterpret_cast<T*>( opaque );
эквивалентна:
void * opaque = static_cast<void*>( object );
T * result = static_cast<T*>( opaque );
Меня интересует только результат
, это гарантированно будет то же значение, эквивалентное исходному объекту
для любого типа T
? Меня не волнует, какой битовый шаблон имеет промежуточный непрозрачный
, поскольку я считаю, что стандарт технически позволяет им быть разными в каждом случае (хотя ни один нормальный компилятор не даст разных результатов).
Обратите внимание: меня не интересует общий случай static_cast
vs. reinterpret_cast
, я хорошо понимаю. Меня интересует приведенный выше очень конкретный случай - результат стандартного назначения специальной логики для static_cast
и void *
, что делает его похожим на reinterpret_cast
. (Есть несколько связанных вопросов по StackOverflow, но они более общие, и мой сценарий, как мне кажется, весьма специфичен)
Помимо стиля и предпочтений, есть ли какая-либо техническая причина, по которой одну форму следует использовать поверх? Или гарантируется, что для всех T
будет получена одна и та же переменная final result
?