Согласно проекту стандарта N4713 (7.11/1):
Константа нулевого указателя представляет собой целочисленный литерал (5.13.2) со значением 0 или 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
?