86 votes

Comment l'initialisation de la valeur "int * ptr = int ()" n'est-elle pas illégale?

Le code suivant (pris d'ici ):

 int* ptr = int();
 

compile dans Visual C ++ et initialise le pointeur par valeur.

Comment est-ce possible? Je veux dire int() donne un objet de type int et je ne peux pas affecter un int à un pointeur.

Comment le code ci-dessus n'est-il pas illégal?

110voto

Jerry Coffin Points 237758

int() est une expression constante avec une valeur de 0; il s'agit donc d'un moyen valide de produire une constante de pointeur nulle. En fin de compte, c’est une façon légèrement différente de dire int *ptr = NULL;

35voto

Blagovest Buyukliev Points 22767

Parce qu' int() rendements en 0, ce qui est interchangeable avec NULL. NULL elle-même est définie comme 0, à la différence de C NULL qui (void *) 0.

Notez que ce serait une erreur:

int* ptr = int(5);

et ce sera encore du travail:

int* ptr = int(0);

0 est une constante spéciale de la valeur et, comme telle, elle peut être considérée comme une valeur de type pointeur. Des expressions constantes que le rendement 0, comme 1 - 1 sont ainsi autorisés en tant que pointeur null constantes.

18voto

Mark Ransom Points 132545

L'expression int() à un entier constant initialisé par défaut, qui correspond à la valeur 0. Cette valeur est spéciale: elle permet d'initialiser un pointeur sur l'état NULL.

13voto

Luc Danton Points 21421

De n3290 (C++03 utilise le même genre de texte), 4.10 Pointeur de conversions [conv.ptr] le paragraphe 1 (l'emphase est mienne):

1 Un pointeur null constante est une partie intégrante expression constante (5.19) prvalue de type entier qui prend la valeur zéro ou un prvalue de type std::nullptr_t. Un pointeur null constante peut être converti en un type pointeur; le résultat est la valeur de pointeur null de ce type et se distingue de tous les autres de la valeur de l'objet pointeur de fonction ou de type pointeur. Une telle conversion est appelé un pointeur null conversion. [...]

int() est une partie intégrante expression constante prvalue de type entier qui prend la valeur de zéro (ce qui est une bouchée!), et peut donc être utilisé pour initialiser un pointeur de type. Comme vous pouvez le voir, 0 n'est pas la seule expression intégrale, qui a la particularité est enfermé.

4voto

Megatron Points 1166

Eh bien, int n'est pas un objet.

Je crois que ce qui se passe ici, c'est que vous dites à int * de pointer sur une adresse mémoire déterminée par int ()

donc si int () crée 0, int * pointera sur l'adresse mémoire 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X