Secondo lo standard (§ 5.2.10 reinterpret_cast
, punto 7):
Un puntatore a un oggetto può essere esplicitamente convertito in un puntatore a una di ff erenti tipo di oggetto. Quando un prvalue v
di tipo “puntatore a T1
” viene convertito nel tipo “puntatore a cv T2
”, il risultato è static_cast<cv T2*>(static_cast<cv void*>(v))
se entrambi T1
e T2
sono tipi standard layout e le esigenze di allineamento T2
sono più severe di quelle di T1
.
Conversione di un prvalue di tipo “puntatore a T1
” al tipo “puntatore a T2” (dove T1
e T2
sono tipi di oggetto e in cui i requisiti di allineamento di T2
sono più severe di quelle di T1
) e alla sua tipo originale restituisce il valore puntatore originale. Il risultato di qualsiasi altra conversione del puntatore non è specificato.
Quindi, potremmo fare la seguente conclusione:
reinterpret_cast<*T>(ptr)
è eqiuvalent a static_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
non è sempre uguale a ptr
, ma reinterpret_cast<>(ptr)
è sempre uguale a ptr
- se ci non ci sono problemi di allineamento, possiamo usare
reinterpret_cast
in sicurezza
Sospetto che questo sia qualcosa che è necessario per una portabilità/conformità standard adeguata perché il risultato di 'reinterpret_cast' non è specificato nello standard. In pratica, probabilmente fanno la stessa cosa in tutte o quasi tutte le implementazioni. –
I due sono equivalenti in C++ 11. – Simple
@SteveJessop: Penso che sia una risposta. –