O seguinte código (retirado daqui ):
int* ptr = int();
compila no Visual C ++ e inicializa o valor do ponteiro.
Como isso é possível? Quer dizer, int()
produz um objeto do tipo int
e não posso atribuir um int
a um ponteiro.
Como o código acima não é ilegal?
c++
visual-c++
pointers
initialization
built-in-types
dente afiado
fonte
fonte
int()
produz o valor do valor construídoint
(que eu acho que é uma coisa especificada em C ++ 03) e o valor padrãoint
é0
. Isso é equivalente aint *ptr = 0;
NULL
poderia ser um valor diferente de zero. Eu disse que poderia ser qualquer constante inteira de valor zero (que incluiint()
).Respostas:
int()
é uma expressão constante com valor 0, portanto, é uma forma válida de produzir uma constante de ponteiro nulo. Em última análise, é apenas uma maneira ligeiramente diferente de dizerint *ptr = NULL;
fonte
nullptr
, que você pode usar em vez de0
ouNULL
em um novo código.0
pode significar uma constante de ponteiro nula ou o número 0, enquantonullptr
é óbvio uma constante de ponteiro nula. Além disso, como disse Jamin, ele também tem "verificações extras de tempo de compilação". Tente pensar antes de digitar.Porque
int()
rende0
, que é intercambiável comNULL
.NULL
em si é definido como0
, ao contrário de C,NULL
que é(void *) 0
.Observe que isso seria um erro:
int* ptr = int(5);
e isso ainda funcionará:
int* ptr = int(0);
0
é um valor constante especial e, como tal, pode ser tratado como um valor de ponteiro. Expressões constantes que produzem0
, como1 - 1
são também permitidas como constantes de ponteiro nulo.fonte
(void *)0
. É simplesmente uma "expressão constante de número inteiro definida pela implementação com o valor 0 ou tal expressão convertida para o tipo void *".NULL
como(void*)0
; sempre foi0
(ou talvez0L
). (Mas então, quando C90 se tornou(void*)0
legal em C, eu já estava usando C ++.)#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
a versão atual do gcc no ubuntu é 4.5, em nosso sistema é 4.0.0
é um literal especial" - apenas porque é uma expressão constante e tem o valor especial 0.(1-1)
é igualmente especial, também é uma constante de ponteiro nulo e assim éint()
. O fato de0
ser literal é condição suficiente, mas não necessária, para ser uma expressão constante. Algo comostrlen("")
, embora também tenha o valor especial0
, não é uma expressão constante e, portanto, não é uma constante de ponteiro nulo.0
, não o0
literal.A expressão é
int()
avaliada como um inteiro inicializado por padrão constante, que é o valor 0. Esse valor é especial: ele é usado para inicializar um ponteiro para o estado NULL.fonte
int f() { return 0; }
, a expressãof()
produz o valor 0, mas não pode ser usada para inicializar um ponteiro.De n3290 (C ++ 03 usa texto semelhante), 4.10 Conversões de ponteiro [conv.ptr] parágrafo 1 (a ênfase é minha):
int()
é uma expressão constante integral prvalue do tipo inteiro que avalia como zero (isso é demais!) e, portanto, pode ser usada para inicializar um tipo de ponteiro. Como você pode ver,0
não é a única expressão integral com caixa especial.fonte
Bem, int não é um objeto.
Eu acredito que o que está acontecendo aqui é que você está dizendo ao int * para apontar para algum endereço de memória determinado por int ()
então, se int () criar 0, int * apontará para o endereço de memória 0
fonte
int()
com certeza é um objeto.int()
. Definirint i;
, então sem dúvida,i
é um objeto.int
é um tipo, não um objeto. Seint()
produz um objeto ou apenas um rvalue, não afeta nada que alguém tenha dito em outro lugar.