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


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

int* ptr = int();

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

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

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

5 85

5 ответов:

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

, потому что int() доходность 0, который является взаимозаменяемым с NULL. определяется как 0, В отличие от C NULL что это (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 - это не единственное интегральное выражение, которое имеет специальный регистр.

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

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

Так что если int () создает 0, int* будет указывать на адрес памяти 0