Ответ 1
int()
является константным выражением со значением 0, поэтому он является допустимым способом создания константы нулевого указателя. В конечном счете, это всего лишь несколько иной способ сказать int *ptr = NULL;
Следующий код (взятый здесь):
int* ptr = int();
компилируется в Visual С++, а value - инициализирует указатель.
Как это возможно? Я имею в виду int()
дает объект типа int
, и я не могу назначить int
указателю.
Как этот код не является незаконным?
int()
является константным выражением со значением 0, поэтому он является допустимым способом создания константы нулевого указателя. В конечном счете, это всего лишь несколько иной способ сказать int *ptr = NULL;
Потому что int()
дает 0
, который является взаимозаменяемым с NULL
. Сама NULL
определяется как 0
, в отличие от C NULL
, которая (void *) 0
.
Обратите внимание, что это будет ошибкой:
int* ptr = int(5);
и это все равно будет работать:
int* ptr = int(0);
0
является специальным постоянным значением и как таковое может рассматриваться как значение указателя. Константные выражения, которые дают 0
, такие как 1 - 1
, также допускаются как константы нулевого указателя.
Выражение int()
оценивается константным значением по умолчанию, которое является значением 0. Это значение является особенным: оно используется для инициализации указателя на состояние NULL.
Из n3290 (С++ 03 использует аналогичный текст), 4.10 Преобразование указателя [conv.ptr], пункт 1 (акцент мой):
1 Константа нулевого указателя представляет собой целочисленное постоянное выражение (5.19) prvalue целочисленного типа, которое оценивается в 0 или значение prdue типа std:: nullptr_t. Константа нулевого указателя может быть преобразована в тип указателя; результат - это нулевое значение указателя этого типа и отличается от любого другого значения указателя объекта или типа указателя функции. Такое преобразование называется преобразованием нулевого указателя. [...]
int()
- это такое целочисленное постоянное выражение prvalue целочисленного типа, которое оценивается до нуля (это глоток!) и, следовательно, может использоваться для инициализации типа указателя. Как вы можете видеть, 0
не является единственным интегральным выражением, которое является специальным.
Well int не является объектом.
Я верю, что происходит здесь, вы говорите, что int * указывает на некоторый адрес памяти, определенный с помощью функции int()
поэтому, если int() создает 0, int * укажет на адрес памяти 0