Modificar un const int en C ++

ejecutar el siguiente código muestra que & x = ptr, entonces ¿cómo es que x y * ptr no son iguales?

const int x=10; int* ptr =(int*) &x; *ptr = (*ptr)+1; cout << &x << " " << x << " " << ptr <<" " <<*ptr; //output : 0012FF60 10 0012FF60 11 

La implementación de C ++ solo es necesaria para que un progtwig funcione si obedeces las reglas. Usted violó las reglas. La implementación de C ++ probablemente se comportó de esta manera:

  • Debido a que x se declara const , la implementación C ++ sabe que su valor no puede cambiar siempre y cuando obedezca las reglas. Entonces, donde sea que se use x , la implementación de C ++ usa 10 sin molestarse en verificar si x ha cambiado.
  • Porque *ptr apunta a un int no-const, lo almacena y lee de él en realidad se realiza. Estos “funcionan” porque la memoria a la que apunta (donde se representa x ) en realidad no está marcada como de solo lectura por el sistema operativo. Por lo tanto, puede realizar modificaciones a pesar del hecho de que se supone que no debe hacerlo.

Observe que el funcionamiento de la implementación C ++ funcionaría si obedecía las reglas . Si no ha modificado x , entonces usar 10 para x donde sea que aparezca habría funcionado normalmente. O bien, si no hubiera declarado que x es const , entonces la implementación de C ++ no habría supuesto que siempre sería 10, por lo que obtendría el valor modificado cada vez que se acceda a x . Esto es todo lo que el estándar de C ++ requiere de una implementación: que funcione si usted sigue las reglas.

Cuando no se siguen las reglas, una implementación de C ++ puede romperse en formas aparentemente inconsistentes.

Estás modificando un objeto declarado const . Este es un comportamiento indefinido; el progtwig no está obligado a hacer nada sensato. Podría parecer que funciona bien, o dar respuestas sutilmente incorrectas, segfault o ejecutar código arbitrario proporcionado por un atacante. La hipérbole habitual es que el progtwig puede hacer volar demonios por la nariz.