С теоретической точки зрения да. Но это ужасная вещь.
NULL
- это константа нулевого указателя, которая назначается указателю, чтобы он ни на что не указывал.
...
ptr = NULL; // now it points to no object anymore
...
// or ptr == 0
if(ptr == NULL) {
...
}
Вот ссылки на Стандарт, если вы заинтересованы в любом случае. Во-первых, константа нулевого указателя: (4.10/1
)
Константа нулевого указателя - это целочисленное константное выражение (5.19) r целого типа, которое оценивается как ноль.
Тогда что произойдет, если мы преобразуем константу нулевого указателя в bool
? Это объясняется в 4.12/1
:
Значение r арифметики, перечисления, указателя или указателя на тип члена может быть преобразовано в значение типа bool. Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложь; а
(когда речь идет о rvalue
, это, по сути, означает простое значение, а не переменную этого типа).
Теперь, что на самом деле является , что NULL
? Прочитайте 18.1/4
(обратите внимание, что в C константа нулевого указателя определяется по-другому. Возможно, именно поэтому она явно ссылается на C ++)
Макрос NULL является константой нулевого указателя C ++, определяемой реализацией в этом международном стандарте
Важным битом этой комбинации является часть "A zero value ... is converted to false
". Присвоение NULL
переменной bool попытается преобразовать NULL
в логическое значение. Как сказано в приведенных выше отрывках, такое преобразование существует и может быть сделано.
Еще одна важная вещь о нулевых указателях для понимания - это различия между null pointer
и null pointer constant
. Как мы только что прочитали, константа нулевого указателя - это некое целое значение, равное нулю. Однако, null pointer
и его значение, null pointer value
, являются указателями, а их тип имеет тип указателя. Следующее имеет тип int и является константой нулевого указателя
#define NULL ('n'-'n') // looks suspicious, but conforms
Потому что это целочисленное константное выражение (то есть целочисленное значение, которое известно во время компиляции) со значением ноль. Ниже приведено нулевое значение указателя
(void*)NULL
но это не константа нулевого указателя. Но в любом случае, также нулевой указатель значения преобразуются в bool, как указано в приведенной выше цитате: "A .. null pointer value .. is converted to false
". Так что у тебя все хорошо.