Ist eine Umwandlung von (Zeiger auf const) zu (Zeiger auf nicht-const) ungültig c ++?

8

Ich bin mir sicher, dass der folgende Code nicht kompiliert werden sollte. Aber in g ++ kompiliert es! Sehen Sie es kompilieren bei Ссылка .

Der Code:

%Vor%

Ist g ++ falsch, wenn man das kompiliert?

    
Gavin Haynes 20.12.2011, 02:34
quelle

3 Antworten

9

Nein. Gemäß §5.4.4 des C ++ - Standards sind die Umwandlungen, die von einem C-artigen Cast ausgeführt werden können:

%Vor%

Dies wird weithin als "casting away const -ness" bezeichnet, und der Compiler würde diesem Teil des Standards nicht entsprechen, wenn er diesen Code nicht kompiliert hätte.

Wie Iildjarn darauf hinweist, ist das Modifizieren eines const Objekts durch das Wegwerfen von const ness ein undefiniertes Verhalten. Dieses Programm zeigt kein undefiniertes Verhalten, weil, obwohl ein Objekt, auf das der Zeiger auf const zeigte, das Objekt selbst nicht const ist (danke R.Martinho und eharvest für die Korrektur meiner schlechten Lesart).

    
Seth Carnegie 20.12.2011, 02:43
quelle
3

Nein. g ++ ist nicht fehlerhaft, wenn Sie Ihren Code kompilieren. die Besetzung, die du getan hast, ist gültig.

(int *)ptr1 ist eine c-Besetzung. Das Äquivalent in C ++ ist const_cast<int*>(ptr1) . der zweite Stil ist klarer zu lesen.

aber die Notwendigkeit, dies zu tun (um eine const-Variable zu ändern) zeigt ein Problem im Design.

    
quelle
1

Die Zeile *((int *)ptr1) = 64 entspricht *(const_cast<int*>(ptr1)) = 64 Die const_cast ist die erste Umwandlung, die ausgeführt wird, wenn Sie die Cast-Notation verwenden.

    
cpx 20.12.2011 02:42
quelle

Tags und Links