La ligne de code suivante compile uniquement bien et se comporte:
list<int * const> int_pointers; // (3)
6 Réponses :
Vous avez lu des déclarations de type de style C à gauche. Donc, "const int *" est un pointeur pour constants intens ("const int" et "int const" signifie la même chose). Ceux sont parfaitement assignables. Mais (2) et (3) sont des pointeurs constants à int, et donc non assignables. p>
1) 2) En bref, le const intptr code> et
const int * code> n'est pas la même chose. P>
const int * code> est "pointeur sur
const int code>". p>
const intptr code> se développe à
int * const code> (penser
(int *) const code>) qui est "
const code> pointeur sur
int code> ". p>
Typedef code> agit comme un ensemble de parenthèses. Vous ne pouvez pas modifier le
Const code> de ce que pointeur
dacteurs Typef code> D Pointe à. P>
Avec le typeDEF, vous définissez le pointeur lui-même aussi constant, comme dans votre 3e déclaration. p> const int * code> est identique à l'écriture
int const * code>, ce qui signifie une valeur constante pointée par un pointeur non constant. p>
Réponse courte:
const (et volatile) doit naturellement apparaître après le type qu'ils admissibles.
Lorsque vous l'avez déjà écrit, le compilateur le réécrit automatiquement en interne: p> devient p> qui est un pointeur sur un constant int. Les listes de ceux-ci compileront une amende puisque le pointeur lui-même est toujours assignable. P> p>
Vous demandez "Pourquoi l'interprétation du compilateur (2) est-elle la même que (3)?". Eh bien, parce que dans la langue C ++ (ainsi que dans C), ils sont EM> sémantiquement les mêmes. Lorsque vous définissez un typename comme puis plus tard, le type Les noms TypeDEF en C ++ ne sont pas des macros. Bien qu'ils ne définissent pas de nouveaux types (juste des alias pour les existants), les alias résultants sont néanmoins «atomiques», «monolithique» dans un sens que tous les qualificatifs appliqués à l'alias s'appliqueront comme haut niveau em > qualificatifs. Lorsque vous travaillez avec un nom de typeDEF, il n'y a aucun moyen de "faufiler dans" un qualificatif de const, de sorte qu'il "descend" à une partie de niveau inférieur du type ( Si vous insistez sur l'utilisation des noms TapeDEF, vous n'avez pas d'autre choix immédiat, mais pour fournir deux noms TypeDEF différents, tels que P> const intptr code> sera debout pour
int * cons code>, pas pour
const int * code>. C'est à quel point les noms Thypef fonctionnent en C ++. P>
int code> dans votre cas ). p>
typedef int *IntPtr;
typedef const int *ConstIntPtr;
Je suis sûr que vous savez que const intPTR code> et
intptr const code> est le même type.
Ce qui signifie
list
list
typedef int * IntPtr;
list<IntPtr const> int_pointers; // (2bis)