Es gibt eine Reihe von Fragen in Bezug auf Crosscasts (Cast von T1*
auf nicht verwandte T2*
), zum Beispiel dies und dies . Die Antwort lautet normalerweise wie folgt: reinterpret_cast
ist die Implementierung definiert und die Konvertierung in void*
gefolgt von static_cast
ist gut definiert. Ich habe jedoch keine wirklichen Beispiele dafür gesehen, was schiefgehen kann, wenn reinterpret_cast
verwendet wird.
Was sind reale Beispiele, bei denen das Umwandeln von void*
funktioniert und reinterpret_cast
nicht funktioniert?
Real-Life-Beispiele, wo Gießen durch void * funktioniert und reinterpret_cast funktioniert nicht
Wenn ich diesen Satz so interpretiere, dass casting through void*
funktioniert , um mir zu helfen, undefiniertes Verhalten zu vermeiden und reinterpret_cast
nicht, dann ist folgendes Beispiel.
reinterpret_cast<TYPE*&>
(Zeigerverweis) kann die strenge Aliasing-Regel (die zumindest für g ++ auftritt) unterbrechen und führt zu einem undefinierten Verhalten. Demo .
Jedoch wird static_cast<void*&>
zu einem Compilerfehler führen und Sie vor einem solchen undefinierten Verhalten bewahren. Demo .
Ich habe eine solche Verwendung in einem intelligenten Zeiger gesehen:
%Vor%casting von T1 * zu nicht verwandtem T2 * mit reinterpret_cast ist nicht weniger definiert als mit static_cast. Wenn sowohl T1 als auch T2 standardmäßige Layout-Typen sind, funktioniert dies genauso (siehe 5.2.10 / 7):
Wenn ein Prvalue v vom Typ "Zeiger auf T1 "wird in den Typ" Zeiger umgewandelt bis cv T2 "ist das Ergebnis static_cast & lt; cv T2 & gt; (statischer_cast & lt; cv void * & gt; (v))
Für Nicht-Standard-Layout-Typen ist das Ergebnis der Konvertierung nicht spezifiziert, aber es ist auch für static_cast nicht spezifiziert.
Ich schätze, Sie können nur dann einen Unterschied feststellen, wenn Sie Nicht-Pointer-Typen in solchen Fällen fälschen:
%Vor%Tags und Links c++ reinterpret-cast casting static-cast