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:
reinterpret_cast<*T>(ptr)
ist eqiuvalent zu static_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
ist nicht immer gleich ptr
, aber reinterpret_cast<>(ptr)
ist immer gleich ptr
- , wenn es ist keine Ausrichtung Probleme, können wir
reinterpret_cast
sicher verwenden
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. –
Die beiden sind in C++ 11 gleichwertig. – Simple
@SteveJessop: Ich denke, das ist eine Antwort. –