Weird Behavior con const_cast

Sé que usar const_cast es generalmente una mala idea, pero estaba jugando con eso y me encontré con un comportamiento extraño, donde:

Dos punteros tienen el mismo valor de dirección, pero cuando se eliminan las referencias, brindan diferentes valores de datos.

¿Alguien tiene una explicación para esto?

Código

 #include  int main() { const int M = 10; int* MPtr = const_cast(&M); (*MPtr)++; std::cout << "MPtr = " << MPtr << " (*MPtr) = " << (*MPtr) << std::endl; std::cout << " &M = " << &M << " M = " << M << std::endl; } 

Salida

 MPtr = 0x7fff9b4b6ce0 (*MPtr) = 11 &M = 0x7fff9b4b6ce0 M = 10 

Entonces, aparte del “comportamiento indefinido” (que lo es), el comstackdor está perfectamente bien para usar el hecho de que M es una constante, por lo tanto no cambiará, en la evaluación de cout ... << M << ... , entonces puede usar una instrucción que tenga el valor inmediato 10, en lugar del valor real almacenado en la memoria de M (Por supuesto, el estándar no indicará cómo funciona esto, más que "no está definido", y los comstackdores pueden elegir diferentes soluciones en diferentes circunstancias, etc., por lo que es muy posible que obtengas resultados diferentes si modificas el código, usa un comstackdor diferente, una versión diferente del comstackdor o el viento sopla en una dirección diferente).

Parte del problema con el "comportamiento indefinido" es que incluye cosas que son "perfectamente lo que puedes esperar" y "casi lo que esperas". El comstackdor también podría decidir iniciar tetris si descubre que esto es lo que estás haciendo.

Y sí, esta es una de las razones por las que NO const_cast usar const_cast . Por lo menos, NO en cosas que originalmente fueron const - está bien si tienes algo en esta línea:

 int x; void func(const int* p) { ... int *q = const_cast(p); *q = 7; } ... func(&x); 

En este caso, x no es realmente const, simplemente se convierte en const cuando lo pasamos a func . Por supuesto, el comstackdor aún puede suponer que x no se cambia en func , y por lo tanto podría tener problemas ...

El progtwig tiene un comportamiento no definido porque no puedes cambiar un objeto const.

Del Estándar C ++

4 Algunas otras operaciones se describen en esta norma internacional como indefinidas (por ejemplo, el efecto de intentar modificar un objeto const ). [Nota: Esta Norma Internacional no impone requisitos sobre el comportamiento de los progtwigs que contienen un comportamiento indefinido. -Finalizar nota]