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?
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).
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.