#c 11 #nullptr
#c 11 #nullptr
Вопрос:
Для g работает следующее
assert(nullptr == 0);
Мне нужно знать, происходит ли какое-либо неявное преобразование типов.
Из того, что я знаю, nullptr
его можно сравнивать только с указателями, а не с целыми числами, а также с тем, что он более типобезопасен. Тогда почему сравнение с целым числом работает?
Ответ №1:
Тогда почему сравнение с целым числом работает?
Потому что в большинстве реализаций nullptr
это машинный адрес 0. Другими словами (intptr_t)nullptr
, равно 0. Например, это относится к Linux / x86-64. Проверьте, проверив сгенерированный код на ассемблере, полученный с помощью g -S -O2 -fverbose-asm
Я даже считаю, что это гарантировано стандартом C (читайте, например, n3337)
Однако, если вы скомпилируете свой код с недавним GCC as gcc -Wall -Wextra
, вы можете получить предупреждение.
Прочитайте также assert(3) . В некоторых случаях (с NDEBUG
) он расширяется до состояния no-op во время компиляции.