'const int' durch 'const_cast' ändern
-
Hallo
Der Titel erscheint vll. etwas unpassend, viel mir aber nicht besser ein, sry ^^
Also, eigentlich habe ich nur einen Test gemacht, und zwar folgenden:
void func(int *ptr) { *ptr = 200; } int main() { const int n = 100; const int *p = &n; cout << n << endl; // Ausgabe 100 cout << *p << endl; // Ausgabe 100 func(const_cast<int*>(p)); cout << n << endl; // Ausgabe 100 cout << *p << endl; // Ausgabe 200 return(0); }Mir ist bewusst, dass das so nicht besonders viel Sinn ergibt und man sogar vll. gar nicht machen sollte/dürfte. Aber es erstaunt mich trotzdem, dass *p nach dem Aufruf der Funktion 200 ergibt und n 100. Ich habe nochmals die Adressen verglichen (&n == p) und trotzdem ergibt n weiterhin 100 während *p den neuen Wert erhalten hatt

Das irritiert mir jetzt. Kann mir vll. jemand erklären was da nun passiert

Bin sehr dankbar!
Gruss,
LEARNcpp
-
Der Compiler hat evtl. die Konstante n direkt geinlined im Code und konnte das dann für p doch nicht tun. Tu mal die Optimierungen anstellen und schau was dann passiert.
Dass der Code hier erlaubt/im Standard definiert ist kann ich mir jedenfalls nicht vorstellen. Wissen tu ich es aber nicht.
MfG SideWinder
-
Ich habe den Code nochmals mit der Compileroption (-od) compiliert. Ich verwende den GCC Compiler und habe vorhin nachgeschaut und entdeckt das mit -od alle Optimierungseinstellungen deaktiviert werden.
Kann es sein das der Compiler automatisch überall wo n aufgerufen wird, einfach mit 100 ersetzt. Ohne jedesmal den im Speicher nach zu schauen (da ja n theoretisch konstant ist)...!?!
Dass der Code hier erlaubt/im Standard definiert ist kann ich mir jedenfalls nicht vorstellen. Wissen tu ich es aber nicht.
Kann ich mir auch nicht vorstellen. Mir ist auch bewusst dass das so keinen Sinn macht. Es geht mir nur darum zu wissen, was da passiert

Vielen Dank für die Antwort!
-
Wenn
const_castauf Variablen angewandt wird, die ursprünglich alsconstdeklariert wurden (im Gegensatz zu Referenzen/Zeigern aufconst), ist das Verhalten des nachfolgenden Zugriffs undefiniert. Und zwar genau, um solche Optimierungen zu ermöglichen.Ist aber selten ein Problem, da die Notwendigkeit dazu üblicherweise ein schlechtes Design voraussetzt.
-
Du rufst undefiniertes Verhalten hervor ("U.B.", machst also etwas, dessen Verhalten nicht definiert ist). Daher kann da alles mögliche rauskommen. Mehr gibt es dazu nicht zu sagen. Du darfst eine "Variable", die "physisch konstant" ist, nicht verändern. Punkt.
int main() { const int i = 42; // i ist "physisch konstant" const int *p = &i; *const_cast<int*>(p) = 99; // Boom! U.B. }int main() { int i = 42; // i ist nicht konstant const int *p = &i; // p zeigt auf const-int *const_cast<int*>(p) = 99; // OK, da i nicht wirklich konstant ist. }
-
Dann ist das geklärt.
Vielen Dank!Gruss,
LEARNcpp