2013-10-10 9 views
11

könnte jemand bitte bitte das bisschen code über casting in http://en.cppreference.com/w/cpp/types/aligned_storage erklären?static_cast und reinterpret_cast für std :: aligned_storage

kann der folgende Code

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

mit

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

ersetzt werden?

Warum hier zwei Casting verwendet werden? Vielen Dank.

Hong

+1

Ich vermute, dass dies für eine korrekte Portabilität/Standardkonformität erforderlich ist, da das Ergebnis von 'reininterpret_cast' nicht im Standard angegeben ist. In der Praxis machen sie wahrscheinlich das Gleiche in allen oder fast allen Implementierungen. –

+2

Die beiden sind in C++ 11 gleichwertig. – Simple

+0

@SteveJessop: Ich denke, das ist eine Antwort. –

Antwort

5

Nach der Norm (§ 5.2.10 reinterpret_cast, Abschnitt 7):

Ein Zeiger zu einem Objekt kann explizit auf einen Zeiger auf einen Typ di ff Erent Objekt umgewandelt werden. Wenn ein prvalue v des Typs „Zeiger auf T1“ auf den Typ „Zeiger auf cv T2“ umgewandelt wird, ist das Ergebnis static_cast<cv T2*>(static_cast<cv void*>(v))wenn beide T1 und T2 sind Standard-Layout-Typen und die Ausrichtungsanforderungen der T2 nicht strenger als die von T1 .

Konvertieren eines prvalue des Typs „Zeiger auf T1“ auf den Typ „Zeiger auf T2“ (wobei T1 und T2 Objekttypen sind und wobei die Ausrichtungsanforderungen der T2 nicht strenger als die von T1) und zurück zu seinen Originaltyp liefert den ursprünglichen Zeigerwert. Das Ergebnis einer anderen Zeigerkonvertierung ist nicht spezifiziert.

So könnten wir die folgende Schlussfolgerung machen:

  1. reinterpret_cast<*T>(ptr) ist eqiuvalent zu static_cast<*T>(static_cast<void*>(ptr))
  2. static_cast<>(ptr) ist nicht immer gleich ptr, aber reinterpret_cast<>(ptr) ist immer gleich ptr
  3. , wenn es ist keine Ausrichtung Probleme, können wir reinterpret_cast sicher verwenden