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