Следующий код (взят отсюда ):
int* ptr = int();
компилируется в Visual C ++ и инициализирует указатель значением.
Как такое возможно? Я имею в виду, что int()
дает объект типа, int
и я не могу присвоить int
указателю.
Как приведенный выше код не является незаконным?
c++
visual-c++
pointers
initialization
built-in-types
острый зуб
источник
источник
int()
дает значение построено значениеint
(которое я думаю, что C ++ 03 указано , что) и значение по умолчаниюint
является0
. Это эквивалентноint *ptr = 0;
NULL
может быть ненулевое значение. Я сказал, что это может быть любая целочисленная константа с нулевым значением (включаяint()
).Ответы:
int()
- постоянное выражение со значением 0, поэтому это допустимый способ создания константы нулевого указателя. В конце концов, это просто немного другой способ сказатьint *ptr = NULL;
источник
nullptr
, который вы можете использовать вместо0
илиNULL
в новом коде.0
может означать константу нулевого указателя или число 0, в то времяnullptr
как очевидна константа нулевого указателя. Вдобавок, как сказал Джамин, он также имеет «дополнительные проверки во время компиляции». Постарайтесь подумать, прежде чем печатать.Потому что
int()
урожаи0
, которые взаимозаменяемы сNULL
.NULL
сам определяется как0
, в отличие от C,NULL
который есть(void *) 0
.Обратите внимание, что это будет ошибкой:
int* ptr = int(5);
и это все равно будет работать:
int* ptr = int(0);
0
- это особое постоянное значение, которое может рассматриваться как значение указателя. Константные выражения, которые дают результат0
, такие1 - 1
как допустимые как константы с нулевым указателем.источник
(void *)0
. Это просто реализация, определяемая «целочисленным постоянным выражением со значением 0 или таким выражением, приведенным к типу void *».NULL
как(void*)0
; так было всегда0
(а может быть0L
). (Но потом, к тому времени, когда C90 легализовали(void*)0
в C, я уже использовал C ++.)#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
версии Linux libio.h содержит: текущая версия gcc в ubuntu - 4.5, в нашей системе - 4.0.0
является особым литералом" - только потому, что это постоянное выражение, и оно имеет специальное значение 0. Не(1-1)
менее особенное, это также константа нулевого указателя, и так далееint()
. Факт0
быть буквальным является достаточным, но не обязательным условием, чтобы быть постоянным выражением. Что-то вроде этогоstrlen("")
, хотя оно также имеет особое значение0
, не является постоянным выражением и, следовательно, не является константой нулевого указателя.0
, а не0
буквальное значение.Выражение
int()
вычисляется как постоянное инициализированное по умолчанию целое число, которое является значением 0. Это значение является особенным: оно используется для инициализации указателя на состояние NULL.источник
int f() { return 0; }
, выражениеf()
дает значение 0, но его нельзя использовать для инициализации указателя.Из n3290 (C ++ 03 использует аналогичный текст), 4.10 Преобразования указателей [conv.ptr], абзац 1 (выделено мной):
int()
- такое интегральное постоянное выражение prvalue целочисленного типа, которое оценивается как ноль (это полный рот!), и поэтому может использоваться для инициализации типа указателя. Как видите,0
это не единственное интегральное выражение, имеющее специальный регистр.источник
Ну, int - это не объект.
Я полагаю, что здесь происходит то, что вы говорите int * указать на некоторый адрес памяти, определенный int ()
поэтому, если int () создает 0, int * будет указывать на адрес памяти 0
источник
int()
безусловно , это объект.int()
. Определитеint i;
, тогда не вопрос,i
это объект.int
это тип, а не объект. Будьint()
дает объект или просто Rvalue не влияет на что - нибудь кто - нибудь говорил в другом месте.