Hacker News new | past | comments | ask | show | jobs | submit login

Specifically it's well-defined behavior to mutate an object after const_cast-ing away constness if the object wasn't const to begin with (const references or const pointers can refer to non-const objects).

In your first example you have `int x = 1;` which isn't const, so the compiler has to assume that `f` may mutate it after const casting.

In your second example you have `const int x = 1;` which is const so the compiler can assume the value will never change.




Except that on embedded const objects might land on read only memory and cast-ing away constness will give hours of debugging pleasure.


They covered that with if the object wasn't const to begin with.


Partially "(const references or const pointers can refer to non-const objects)".

Here are the references to linker scripts?


I'm afraid I'm not following.

I believe this account of things is accurate (ignoring C++'s reference types for simplicity):

The C and C++ standards are written in such a way as to enable compilers to place constant data on read-only memory. Casting away constness is never illegal in and of itself, but if you do so and then assign to a variable which was declared as const, that is undefined behaviour.

Similarly, assigning into the character array of a string literal is undefined behaviour, whether or not const was used. Again that's to enable the compiler to make use of read-only memory.

Going in the other direction is safe, as preventing assignments doesn't introduce problems. That is to say, using a pointer-to-const type to point to a non-const variable poses no problem.

Related:

https://stackoverflow.com/a/9079161/

https://wiki.sei.cmu.edu/confluence/display/c/EXP05-C.+Do+no...


You must be right. But - it's so easy to forget that! Or - never to be told that in the first place.




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: