Как инициализация значения int * ptr = int() не является незаконной?

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

int* ptr = int();

компилируется в Visual С++, а value - инициализирует указатель.

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

Как этот код не является незаконным?

Ответ 1

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

Ответ 2

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

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

int* ptr = int(5);

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

int* ptr = int(0);

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Well int не является объектом.

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

поэтому, если int() создает 0, int * укажет на адрес памяти 0