Le code suivant (tiré d'ici ):
int* ptr = int();
compile en Visual C ++ et initialise la valeur du pointeur.
Comment est-ce possible? Je veux dire int()
donne un objet de type int
et je ne peux pas attribuer un int
à un pointeur.
En quoi le code ci-dessus n'est-il pas illégal?
c++
visual-c++
pointers
initialization
built-in-types
dents acérées
la source
la source
int()
la valeur construite est la valeur deint
(qui est, je pense, une chose spécifiée par C ++ 03) et la valeur par défaut deint
est0
. Cela équivaut àint *ptr = 0;
NULL
pourrait être une valeur non nulle. J'ai dit que cela pouvait être n'importe quelle constante entière de valeur zéro (qui comprendint()
).Réponses:
int()
est une expression constante avec une valeur de 0, c'est donc un moyen valide de produire une constante de pointeur nul. En fin de compte, c'est juste une manière légèrement différente de direint *ptr = NULL;
la source
nullptr
, que vous pouvez utiliser à la place0
ouNULL
dans un nouveau code.0
peut évidemment signifier une constante de pointeur nul ou le nombre 0, alors quenullptr
c'est évident une constante de pointeur nul. De plus, comme Jamin l'a dit, il dispose également de "contrôles supplémentaires à la compilation". Essayez de réfléchir avant de taper.Parce que les
int()
rendements0
, qui sont interchangeables avecNULL
.NULL
lui-même est défini comme0
, contrairement à CNULL
qui est(void *) 0
.Notez que ce serait une erreur:
int* ptr = int(5);
et cela fonctionnera toujours:
int* ptr = int(0);
0
est une valeur constante spéciale et en tant que telle, elle peut être traitée comme une valeur de pointeur. Expressions constantes qui produisent0
, telles que les1 - 1
constantes de pointeur nul.la source
(void *)0
plus. C'est simplement une implémentation définie "expression constante entière avec la valeur 0, ou une telle expression convertie en type void *".NULL
comme(void*)0
; c'était toujours0
(ou peut-être0L
). (Mais ensuite, au moment où C90 a été(void*)0
légalisé en C, j'utilisais déjà C ++.)#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
la version actuelle de gcc dans ubuntu est 4.5, dans notre système est 4.0.0
est un littéral spécial" - uniquement parce que c'est une expression constante et qu'il a la valeur spéciale 0.(1-1)
est tout aussi spécial, c'est aussi une constante de pointeur nul, et il en est de mêmeint()
. Le fait d'0
être un littéral est une condition suffisante mais non nécessaire pour être une expression constante. Quelque chose commestrlen("")
, bien qu'il ait également la valeur spéciale0
, n'est pas une expression constante et n'est donc pas une constante de pointeur nul.0
, pas le0
littéral.L'expression est
int()
évaluée à un entier constant initialisé par défaut, qui est la valeur 0. Cette valeur est spéciale: elle est utilisée pour initialiser un pointeur vers l'état NULL.la source
int f() { return 0; }
, l'expressionf()
renvoie la valeur 0, mais elle ne peut pas être utilisée pour initialiser un pointeur.À partir de n3290 (C ++ 03 utilise un texte similaire), 4.10 Conversions de pointeur [conv.ptr] paragraphe 1 (l'accent est mis sur moi):
int()
est une telle expression constante intégrale prvalue de type entier qui évalue à zéro (c'est une bouchée!), et peut donc être utilisée pour initialiser un type de pointeur. Comme vous pouvez le voir, ce0
n'est pas la seule expression intégrale à casse spéciale.la source
Eh bien, int n'est pas un objet.
Je crois que ce qui se passe ici, c'est que vous dites à l'int * de pointer vers une adresse mémoire déterminée par int ()
donc si int () crée 0, int * pointera vers l'adresse mémoire 0
la source
int()
est certainement un objet.int()
. Définirint i;
, alors pas de question,i
est un objet.int
c'est un type, pas un objet. Que ce soitint()
un objet ou juste une rvalue n'affecte rien de ce que quelqu'un a dit ailleurs.