Was genau macht static_cast?
-
Hi,
ich frage mich was genau static_cast macht?
Es überprüft ja nicht, ob das casten Möglich ist
und wirft auch keine Exceptions falls es nicht möglich ist.Is es nur dafür da um zum Beispiel bei einer Zuweisung von einem signed zu einem unsigned Integer die Compilerwarnung zu umgehen?
-
Ja, meist wird damit die Compilerwarnung umgangen.
Der static_cast Operator wird aber auch dazu verwendet,
einen typenlosen Zeiger (void*) in einen anderen Zeiger zu konvertieren.
-
static_cast überprüft durchaus ob das casten möglich ist, allerdings zur Compilezeit. Was du und Unregistrierter eher meinen wäre ein reinterpret_cast.
Schaut auch mal in die FAQ.
-
man kann mit static_cast compilerwarnungen umgehen. aber eigentlich geht es darum typumwandlungen durchzuführen, die implizit nicht durchgeführt werden (int zu double in eine division bspw).
zu beachten ist, dass static_cast tatsächlich eine umwandlung durchführt und nicht wie reinterpret_cast einfach sagt, dass das jetzt ein anderer typ ist. static_cast kann daher im gegensatz zu reinterpret_cast durchaus code erzeugen.
ansonste gilt: wenn man seinen code mit static_cast zukleistern muss, hat man häufig etwas falsch gemacht.
-
static_cast ist auch dazu da, die Zwiespältigkeit eines C-Style-Cast zu diffenrenzieren, da ein C-Style-Cast je nach Kontext sich wie ein static_cast oder wie ein reinterpret_cast verhalten kann.
Also:
static_cast - inhaltliche Umwandlung
reinterpret_cast - Umwandlung durch Neuinterpretierung der binären Darstellung
-
Der static_cast erzeugt ein neues Objekt mit dem alten Objekt als Input. Zur Übersetzungszeit wird einfach geprüft ob ein entsprechender Konstruktor vorhanden ist und falls ja wird dieser verwendet.
-
@Statiker:
Das ist nur die halbe Miete. U.a. prüft static_cast auch bei der Umwandlung von Zeigern auf Objekte, ob die Typen vollständig und ineinander konvertierbar sind (und lehnt ggf. die Konvertierung ab) und führt eine Offset-Korrektur des Zeigers durch. Insbesondere bei virtueller und Mehrfach-Vererbung wichtig. Ein C-Style-Cast vergewaltigt bei unvollständigen Typinfos einfach den Zeiger.
-
Statiker schrieb:
Der static_cast erzeugt ein neues Objekt mit dem alten Objekt als Input.
das wird häufig gemacht, muss aber nicht passieren. wenn die objekttypen binär kompatibel sind, erzeugen viele compiler kein neues objekt.
static_cast garantiert nur, dass hinterher eine vollständige, funktionierte instanz des anderen typen vorhanden ist. wie es das anstellt, ist nicht definiert.