C ++ const_cast Verwendung statt C-Style-Casts

7

Warum ist das folgende?:

%Vor%     
JaredPar 16.12.2008, 06:30
quelle

3 Antworten

20
%Vor%

Die Kompilierungsfehler werden verursacht, weil Sie const away const nicht ablegen. Stattdessen kopierst du i0. Für diesen Vorgang ist kein Cast erforderlich:

%Vor%

Der Typ, in den Sie einwerfen, sollte eigentlich ein 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 die Konstante const wegwerfen, da die Dereferenzierung des Zeigers einen anderen Typ für const T* ( const T ) ergibt als für T* ( T ). Für Referenzen gilt das Gleiche: T& greift auf das Objekt mit einem anderen this Zeigertyp zu als mit const T& . Nun, was du wirklich archivieren wolltest:

%Vor%

Das obige Verhalten kann zu undefiniertem Verhalten führen, wenn Sie mit einem Verweis auf nicht-const auf ein ursprünglich konstantes Objekt schreiben (eigentlich ist das bloße Gießen und Lesen in sich kein undefiniertes Verhalten. Aber wenn Sie const , Sie können auch dazu schreiben, was dann das undefinierte Verhalten ergibt)

    
Johannes Schaub - litb 16.12.2008 06:36
quelle
5

Es ist ein Fehler, weil der Standard sagt, dass es nicht erlaubt ist. Der Standard zählt die Arten von Konvertierungen auf, die const_cast ausführen darf, und er lässt alles, was nicht auf der Liste steht, nicht zu. Es ermöglicht Folgendes:

  • Zeiger
  • Referenzen
  • Member-Zeiger

Da deine Typen keine davon sind, sind sie nicht erlaubt.

Auf der hellen Seite brauchen die Beispiele, die Sie angegeben haben, auch nicht const_cast .

    
Rob Kennedy 16.12.2008 07:01
quelle
0

Für den 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 und nicht hinzuzufügen.

Referenz: Ссылка

    
JaredPar 16.12.2008 06:35
quelle

Tags und Links