Si sta chiedendo "Perché l'interpretazione del compilatore (2) è uguale a (3)?". Bene, perché in linguaggio C++ (così come in C) sono semanticamente uguale.Quando si definisce un typename come
typedef int *IntPtr;
poi il tipo const IntPtr
starà per int *const
, non per const int *
. È così che i nomi typedef funzionano in C++.
I nomi typedef in C++ non sono macro. Sebbene non definiscano nuovi tipi (solo alias per quelli esistenti), gli alias risultanti sono tuttavia "atomici", "monolitici" nel senso che tutti i qualificatori applicati all'alias verranno applicati come qualificatori di livello superiore. Quando si lavora con un nome typedef, non c'è modo di "intrufolarsi" in un qualificatore const in modo che possa "discendere" in una porzione di livello inferiore del tipo (int
nel tuo caso).
Se ti ostini a usare typedef-nomi, non hai altra scelta immediata, ma di fornire due diversi typedef-nomi, come
typedef int *IntPtr;
typedef const int *ConstIntPtr;
e usare ConstIntPtr
quando si ha bisogno di una versione puntatore a const di Il tipo.
+1, buona risposta :-) –