void * с static_cast vs intptr_t с reinterpret_cast

Я хочу знать, есть ли конкретные, основанные на стандартах различия между двумя разными типами приведений очень конкретных типов. В частности, задано: 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 ?

16
задан edA-qa mort-ora-y 27 October 2011 в 14:02
поделиться