El static_cast
ist besser geeignet für die Umwandlung einer void*
auf einen Zeiger eines anderen Typs.
static_cast
ist das Mittel der Wahl, wenn es eine natürliche, intuitive Konvertierung zwischen zwei Typen gibt, bei der nicht unbedingt gewährleistet ist, dass sie zur Laufzeit funktioniert. Sie können zum Beispiel verwenden static_cast
um Zeiger von Basisklassen in Zeiger von abgeleiteten Klassen zu konvertieren, eine Konvertierung, die in einigen Fällen sinnvoll ist, aber erst zur Laufzeit überprüft werden kann. In ähnlicher Weise können Sie static_cast
zur Konvertierung von einer int
zu einer char
die wohldefiniert ist, aber bei der Ausführung zu einem Verlust an Präzision führen kann.
reinterpret_cast
ist dagegen ein Gießereibetrieb, der für Umwandlungen konzipiert ist, die grundsätzlich nicht sicher oder nicht tragbar sind. Zum Beispiel können Sie mit reinterpret_cast
zur Konvertierung von einer void *
zu einer int
, die korrekt funktioniert, wenn Ihr System zufällig über sizeof (void*)
≤ sizeof (int)
. Sie können auch verwenden reinterpret_cast
zur Umwandlung einer float*
zu einer int*
oder umgekehrt, was plattformspezifisch ist, da die jeweiligen Darstellungen von float
s und int
s haben nicht unbedingt etwas miteinander zu tun.
Kurz gesagt, wenn Sie jemals eine Konvertierung durchführen, bei der der Cast logisch sinnvoll ist, aber zur Laufzeit nicht unbedingt erfolgreich sein wird, vermeiden Sie reinterpret_cast
. static_cast
ist eine gute Wahl, wenn man im Voraus weiß, dass der Cast zur Laufzeit funktionieren wird, und dem Compiler mitteilt: "Ich weiß, dass dies vielleicht nicht funktioniert, aber zumindest macht es Sinn und ich habe einen Grund zu glauben, dass es zur Laufzeit das Richtige tun wird." Der Compiler kann dann überprüfen, ob der Cast zwischen verwandten Typen erfolgt, und meldet einen Kompilierfehler, wenn dies nicht der Fall ist. Verwendung von reinterpret_cast
dies mit Zeigerumwandlungen zu tun, umgeht die Sicherheitsprüfung zur Kompilierzeit vollständig.
Es gibt ein paar Umstände, unter denen Sie eine dynamic_cast
anstelle einer static_cast
aber diese beinhalten meist Abwandlungen in einer Klassenhierarchie und betreffen (nur selten) direkt void*
.
Was die Frage anbelangt, welche der beiden von der Spezifikation bevorzugt wird, so wird keine von beiden ausdrücklich als "die Richtige" erwähnt (oder zumindest kann ich mich nicht daran erinnern, dass eine der beiden auf diese Weise erwähnt wurde). static_cast
über reinterpret_cast
. Wenn Sie zum Beispiel einen Cast im C-Stil verwenden, wie in
A* ptr = (A*) myVoidPointer;
Die Reihenfolge der Casting-Operatoren, die ausprobiert wird, versucht immer, eine static_cast
vor einer reinterpret_cast
Das ist das gewünschte Verhalten, denn reinterpret_cast
ist nicht garantiert tragbar.
82 Stimmen
@anon Offenbar haben Sie noch nie mit POSIX-Threads gearbeitet.
10 Stimmen
@user470379 Wow... das ist der Grund, warum ich bei SO auf diese Frage gestoßen bin! Ausgezeichnete Beobachtung :-).