Bitte beachten Sie den folgenden Code:
%Vor%Kompiliert mit g ++ 4.6 mit -O3, kann ich sehen, dass das kompilierte Element den Wert von "a" zwischen den Funktionsaufrufen erneut liest. Wenn man die Definition von 'const int' ändert, tut der Compiler das nicht und lädt stattdessen einfach den unmittelbaren Wert "12" in edi. Das gleiche gilt, wenn a nicht const ist, aber ich ändere die Signatur von func1, um sie als Wert zu akzeptieren.
Obwohl dies kein Fehler in der Code-Generierung ist, ist dies immer noch ein merkwürdiges Verhalten. So wie es ist, dass sich func1 verpflichtet hat, a nicht zu ändern, warum sollte sich der Code des Compilers danach ändern, ob a const ist oder nicht?
Bearbeiten : Einige Skeptiker behaupten, dass ich den Code falsch lesen könnte. Der obige Code erzeugt folgendes mit -S-Kompilierung:
%Vor%Ändern von a in const erzeugt:
%Vor% In% C ++ ist const
wirklich nur logische Konstanz und nicht physikalische Konstanz. func1
kann const_cast
und i
bearbeiten. const
ist wie die Sicherheit einer Waffe - Sie können sich immer noch in den Fuß schießen, aber nicht zufällig.
als T.C. und juanchopanza haben in den Kommentaren darauf hingewiesen, die const
ness eines Objekts wegzuwerfen und es zu modifizieren ist UB. Zitat aus "Notizen" hier :
Auch wenn const_cast die Konstanz oder Flüchtigkeit eines beliebigen Pointers oder einer Referenz entfernen kann, führt die Verwendung des resultierenden Zeigers oder Verweises zum Schreiben in ein Objekt, das als const deklariert wurde, oder zu einem Objekt, das als flüchtig deklariert wurde, zu undefiniertem Verhalten.
Zusammenfassend die Antworten, ich denke, das erklärt es am besten:
Es ist legal, eine const-Referenz auf eine nicht-const-Variable zu nehmen und dann die constness wegzuwerfen. Daher kann der Compiler im ersten Fall nicht davon ausgehen, dass func1 a
nicht ändern wird.
Es ist undefiniert, was passiert, wenn Sie die constness in eine Variable mit der Bezeichnung const ablegen. Der Compiler im zweiten Fall kann davon ausgehen, dass func1 die Konstante nicht wegwerfen wird. Wenn func1 die Konstante wegwirft, erhält func2 den "falschen" Wert, aber das ist nur eine Folge von undefiniertem Verhalten.