Согласно стандарту C ++ 17 (литералы указателя 5.13.7)
1 Литерал указателя - это ключевое слово nullptr. Это значение типа std :: nullptr_t. [Примечание: std :: nullptr_t - это отдельный тип, который не является ни типом указателя, ни типом указателя на член; скорее, prvalue этого типа является константой нулевого указателя и может быть преобразовано в значение нулевого указателя или значение указателя на нулевой член. См. 7.11 и 7.12. - конец примечания]
И (7 стандартных преобразований)
4 Некоторые языковые конструкции требуют преобразования выражения в логическое значение. Выражение e, появляющееся в таком контексте, считается контекстно преобразованным в bool и является правильно сформированным тогда и только тогда, когда объявление bool t (e); имеет правильный формат для некоторой придуманной временной переменной t (11.6).
И наконец (7.14 булевых преобразований)
1 Значение арифметики, перечисления без области действия, указателя или типа указатель на член может быть преобразовано в значение типа bool. Нулевое значение, значение нулевого указателя или значение указателя нулевого члена преобразуется в ложное; любое другое значение преобразуется в истину. Для прямой инициализации (11.6) prvalue типа std :: nullptr_t может быть преобразовано в prvalue типа bool; результирующее значение ложно.
То есть вы можете написать например
bool b( nullptr );
но вы можете не писать (хотя в некоторых компиляторах есть ошибка, связанная с этим)
bool b = nullptr;
Таким образом, nullptr
можно контекстно преобразовать в объект типа bool, например, в операторах выбора, таких как оператор if.
Рассмотрим, например, унарный оператор !
как в операторе if
if ( !nullptr ) { /*...*/ }
Согласно описанию оператора (8.5.2.1 Унарные операторы)
9 Операнд оператора логического отрицания! контекстно конвертируется в bool (пункт 7); его значение истинно, если преобразованный операнд ложно, и ложно в противном случае. Тип результата - bool
Таким образом, nullptr
в этом выражении не преобразуется в указатель. Он напрямую контекстно конвертируется в bool.
person
Vlad from Moscow
schedule
16.08.2019
nullptr
не являетсяbool
с самого начала. Значение nullptr false при преобразовании в bool в порядке. - person HolyBlackCat   schedule 13.09.2020