Как инициализация значения int * ptr = int () не является недопустимой? - PullRequest
86 голосов
/ 09 ноября 2011

Следующий код (взятый отсюда ):

int* ptr = int();

компилируется в Visual C ++ и инициализирует значение указателя.

Как это возможно?Я имею в виду, что int() дает объект типа int, и я не могу присвоить int указателю.

Как приведенный выше код не является недопустимым?

Ответы [ 5 ]

110 голосов
/ 09 ноября 2011

int() - это константное выражение со значением 0, поэтому это правильный способ создания константы нулевого указателя.В конечном счете, это просто немного другой способ сказать int *ptr = NULL;

35 голосов
/ 09 ноября 2011

Потому что int() дает 0, который взаимозаменяем с NULL.NULL сам по себе определяется как 0, в отличие от C NULL, который равен (void *) 0.

. Обратите внимание, что это будет ошибкой:

int* ptr = int(5);

, и это все равно будет работать:

int* ptr = int(0);

0 - это специальное постоянное значение, и поэтому оно может рассматриваться как значение указателя.Выражения констант, которые дают 0, такие как 1 - 1, также допускаются как константы нулевого указателя.

18 голосов
/ 09 ноября 2011

Выражение int() оценивается как постоянное инициализированное по умолчанию целое число, которое является значением 0. Это значение является специальным: оно используется для инициализации указателя на состояние NULL.

13 голосов
/ 09 ноября 2011

Начиная с n3290 (C ++ 03 использует похожий текст), 4.10 Преобразование указателей [conv.ptr] параграф 1 (акцент мой):

1 Константа нулевого указателя равна целочисленное константное выражение (5.19) prvalue целочисленного типа с нулевым значением или prvalue типа std :: nullptr_t.Константа нулевого указателя может быть преобразована в тип указателя; результатом является нулевое значение указателя этого типа , которое отличается от любого другого значения указателя объекта или типа указателя на функцию.Такое преобразование называется преобразованием нулевого указателя.[...]

int() - это такое целочисленное постоянное выражение prvalue целочисленного типа, которое оценивается как ноль (это полный рот!) И, таким образом, может использоваться для инициализации типа указателя.Как видите, 0 - не единственное целочисленное выражение в специальном регистре.

4 голосов
/ 09 ноября 2011

Ну, int не является объектом.

Я полагаю, что здесь происходит, вы говорите, что int * указывает на некоторый адрес памяти, определенный int ()

, так что если int() создает 0, int * будет указывать на адрес памяти 0

...