2008-12-16 8 views
7

Warum ist folgendes ?:C++ const_cast Verwendung anstelle von C-Casts

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 
+0

könnten Sie die Fehlermeldungen vom Compiler hinzufügen? –

+0

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 –

Antwort

0

Zum ersten Fehler. const_cast kann nur für Zeiger- oder Referenztypen verwendet werden. "int" ist weder. Dies kann oder kann nicht der C++ - Standard sein (konnte keine gute Referenz finden). Aber es ist der Fall für bestimmte Implementierungen wie MS C++ Compiler.

Für den zweiten Fehler. const_cast kann nur verwendet werden, um ein const oder volatile Qualifier zu entfernen, nicht um es hinzuzufügen.

Referenz: http://msdn.microsoft.com/en-us/library/bz6at95h(VS.80).aspx

+1

Der Operator const_cast (nur C++) Der Operator const_cast wird verwendet, um einen konstanten oder flüchtigen Modifizierer zu einem Typ hinzuzufügen oder daraus zu entfernen. Von: http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_const_cast.htm –

20
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)

+0

Ist es wirklich undefiniert Verhalten zu einfach HABEN Sie einen nichtkonstanten Verweis auf ein konstantes Objekt?Ich dachte, du musstest versuchen, es zu modifizieren. Ihr Beispiel greift überhaupt nicht auf i2 zu; es definiert es nur. –

+0

Gibt es Situationen, in denen eine C-Stil-Umwandlung von (int) nach (const int) oder von (const int) nach (int) nützlich wäre, weil const_cast und const_cast nicht zulässig sind? –

+0

Kenny, nein, es gibt keine Situationen. Es gibt keine konstanten rvalues ​​des eingebauten Typs. also das wäre entweder illegal, oder genau das gleiche wie "int" (hängt davon ab, was der Standard sagt, habe ich nicht gerade in der Schule nachgeschlagen) –

5

Es ist ein Fehler, weil der Standard sagt, dass es nicht erlaubt ist. Der Standard listet die Arten von Konvertierungen auf, die const_cast ausführen dürfen, und es verbietet alles, was nicht auf der Liste steht. Es ermöglicht die folgenden:

  • Pointers
  • Referenzen
  • Member-Zeiger

Da Ihr Typen nicht von denen sind, sind sie nicht erlaubt.

Auf der hellen Seite, die Beispiele, die Sie gaben, nicht brauchenconst_cast, entweder.

Verwandte Themen