По проекту стандарта N4713 (7.11 / 1):
Константа нулевого указателя - это целочисленный литерал (5.13.2) с нулевым значением или prvalue типа
std::nullptr_t
.
и 21.2.3 / 2:
Макрос
NULL
- это константа нулевого указателя, определяемая реализацией.
следует, что NULL
можно определить как nullptr
. То же самое упоминается в cppreference:
#define NULL 0
//since C++11
#define NULL nullptr
В то же время в пункте «Аддитивные операторы» сказано (8.5.6 / 7):
Если значение
0
добавляется к значению нулевого указателя или вычитается из него, результатом является значение нулевого указателя. Если вычитаются два значения нулевого указателя, результат сравнивается со значением0
, преобразованным в типstd::ptrdiff_t
.
Следовательно, следующий код должен быть действительным:
0 + nullptr;
nullptr - nullptr;
но из-за отсутствия операторов +/- для std::nullptr_t
код недействителен.
Есть ли что-то, что я не учел, или макрос NULL
не может быть определен как nullptr
?
nullptr_t
и литералом 0 важно, да. Но, учитывая значение типа std :: nullptr_t, вы утверждаете, что значение prvalue не является значением? Это абсурд. - person Cheers and hth. - Alf   schedule 21.02.2018std::nullptr_t
, которое не является типом указателя, поэтому нет оснований называть его значением нулевого указателя (это вообще не значение указателя). В любом случае в предложении «Аддитивные операторы» перечислены типы, которые могут участвовать в аддитивных операторах, иstd::nullptr_t
не входит в их число, поэтомуstd::nullptr - std::nullptr
недействителен независимо от того, вызываете ли выstd::nullptr
значение нулевого указателя или нет. - person n. 1.8e9-where's-my-share m.   schedule 21.02.2018