Se pregunta "¿Por qué la interpretación del compilador (2) es la misma que (3)?". Bueno, porque en el lenguaje C++ (así como también en C), son semánticamente iguales.Cuando se define un nombre de tipo como
typedef int *IntPtr;
luego el tipo const IntPtr
se presentará a int *const
, no para const int *
. Así es como funcionan los nombres typedef en C++.
Los nombres de nombre de archivo en C++ no son macros. Si bien no definen nuevos tipos (solo alias para los existentes), los alias resultantes son, sin embargo, "atómicos", "monolíticos" en el sentido de que los calificadores aplicados al alias se aplicarán como calificadores de nivel superior. Cuando trabaje con un typedef-name, no hay forma de "infiltrarse" en un calificador const para que de alguna manera "descienda" a una parte de nivel inferior del tipo (int
en su caso).
Si usted insiste en el uso de typedef-nombres, que no tienen otra opción inmediata, sino para proporcionar dos typedef-nombres diferentes, como
typedef int *IntPtr;
typedef const int *ConstIntPtr;
y utilizar ConstIntPtr
cuando se necesita una versión de puntero a const de el tipo.
+1, buena respuesta :-) –