Как инициализация значения "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
- это не единственное интегральное выражение, которое имеет специальный регистр.