Darf ich ein Beispiel aus dem wirklichen Leben haben, in dem casting void * funktioniert und reinterpret_cast nicht funktioniert?

8

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?

    
sharptooth 06.07.2011, 10:24
quelle

2 Antworten

1
  

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%     
iammilind 06.07.2011 10:41
quelle
0

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%     
Konstantin Oznobihin 06.07.2011 11:02
quelle