Genau, der static_cast Befehl ruft den entsprechenden Konstruktor der Zielklasse auf oder wenn vorhanden den speziellen Cast Operator.
Wenn man sich eine Klasse für römische Zahlen schreibt, würde es genügen, einen Konstruktor zu haben, der nur einen int als Argument hat, um von int zu römische Zahl
casten zu können.
Gibt es keinen entsprechenden Einzelargument Konstruktor und einen entsprechenden überladenen Cast Operator, wird sich der Compiler beschweren.
Bei einem dynamic_cast muss man zur Laufzeit des Programms den Fehler abfangen.
Auf Void Pointer ist keine Pointer-Arithmetik zugelassen! (Zumindest nicht bei standardkonformen C/C++).
Der Typ eines Pointers verrät dem Compuer schließlich erst, wieviel Speicher das Element dahinter einnimmt, der Pointer selber ist nur eine Speicheradresse.
Die könnte man prinzipiell auch in einer size_t Variable speichern oder irgendwelchen anderen Variablen, die lang genug sind. Unter C++ würde man dafür dann den reinterpret_cast benutzen
Void Pointer sollte man quasi nur für generische Schnittstellen verwenden, bei denen man den Datentyp nicht festlegen möchte, z.B. bei Threading mit PThreads.
Ein Void Pointer sollte immer zum gewünschten Datentyp umgecastet werden. Das birgt gewisse Gefahren, wenn jemand einen falschen Datentyp übergibt.
Daher sollte bei Funktionen, die Void-Pointer umcasten sichergestellt sein, dass nur richtige Datentypen übergeben werden können.
Also niemals eine Schnittstelle definieren, die Void-Pointer akzeptiert und dann intern umcastet.
@Fritzler:
Musst du beim lesen nicht den Float-Pointer auf Char-Pointer umcasten? Sonst versucht doch der Index-Operator auf ein Float-Array zuzugreifen und nicht auf ein Char-Array.