const int i0 = 5;
//int i1 = const_cast<int>(i0); // compilation error
int i2 = (int)i0; // okay
int i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
const int i5 = (const int)i3; // okay
Die Kompilierungsfehlern verursacht werden, weil Sie werfen const nicht weg/add konst. Stattdessen kopierst du i0. Für diesen Vorgang wird keine Besetzung überhaupt erforderlich:
int i1 = i0;
const int i4 = i3;
Der Typ Sie werfen soll tatsächlich einen Zeiger oder eine Referenz sein. Andernfalls macht die Verwendung von const_cast keinen Sinn, da Sie es direkt kopieren können. Beispielsweise können Sie für Zeiger den const wegwerfen, da der Dereferenzierung des Zeigers einen anderen Typ für eine (const T
) ergibt als für eine T*
(T
) ergibt. Für Referenzen gilt das Gleiche: T&
greift auf das Objekt zu, indem ein anderer dieser Zeigertyp als const T&
verwendet. Nun, was Sie wirklich zu archivieren wollte:
const int i0 = 5;
//int & i1 = const_cast<int&>(i0); // okay (but dangerous)
int & i2 = (int&)i0; // okay (but dangerous)
int i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
const int&i5 = (const int&)i3; // okay too!
Das Obige kann zu undefinierten Verhalten führen, wenn Sie auf ein ursprünglich konstantes Objekt durch einen Verweis auf nicht-const schreiben (eigentlich nur Gießen und es ist das Lesen nicht undefiniert Verhalten in sich selbst. Aber wenn Sie const wegwerfen, können Sie auch schreiben, was dann das undefinierte Verhalten ergibt)
könnten Sie die Fehlermeldungen vom Compiler hinzufügen? –
ungültige Verwendung von const_cast mit dem Typ 'int ', der kein Zeiger ist, Verweis, noch ein Zeiger auf Datenelementtyp ungültige Verwendung von const_cast mit dem Typ' const int', der kein Zeiger ist, Referenz oder Zeiger auf Datenelement –