2013-10-10 24 views
11

qualcuno potrebbe spiegare il bit di codice sul casting in http://en.cppreference.com/w/cpp/types/aligned_storage per favore?static_cast e reinterpret_cast per std :: aligned_storage

può il seguente codice

return *static_cast<const T*>(static_cast<const void*>(&data[pos])); 

essere sostituito con

return *reinterpret_cast<const T*>(&data[pos]); 

?

Perché qui vengono utilizzati due casting? Grazie mille.

Hong

+1

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. –

+2

I due sono equivalenti in C++ 11. – Simple

+0

@SteveJessop: Penso che sia una risposta. –

risposta

5

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:

  1. reinterpret_cast<*T>(ptr) è eqiuvalent a static_cast<*T>(static_cast<void*>(ptr))
  2. static_cast<>(ptr) non è sempre uguale a ptr, ma reinterpret_cast<>(ptr) è sempre uguale a ptr
  3. se ci non ci sono problemi di allineamento, possiamo usare reinterpret_cast in sicurezza