Modifying a const int in C++ [duplicate]
The C++ implementation is only required to make a program work if you obey the rules. You violated the rules. The C++ implementation likely behaved this way:
- Because
x
is declaredconst
, the C++ implementation knows its value cannot change as long as you obey the rules. So, whereverx
is used, the C++ implementation uses 10 without bothering to check whetherx
has changed. - Because
*ptr
points to a non-constint
, stores to it and reads from it are actually performed. These “work” because the memory it points to (wherex
is represented) is not actually marked read-only by the operating system. Thus, you are able to make modifications in spite of the fact that you are not supposed to.
Observe that the behavior of the C++ implementation would work if you obeyed the rules. If you had not modified x
, then using 10 for x
wherever it appeared would have worked normally. Or, if you had not declared x
to be const
, then the C++ implementation would not have assumed it would always be 10, so it would get the changed value whenever x
was accessed. This is all the C++ standard requires of an implementation: That it work if you follow the rules.
When you do not follow the rules, a C++ implementation may break in seemingly inconsistent ways.
You're modifying an object declared const
. This is undefined behavior; the program is not required to do anything sensible. It could appear to work fine, or give subtly wrong answers, or segfault, or execute arbitrary code supplied by an attacker. The usual hyperbole is that the program is allowed to make demons fly out your nose.