根据标准N4713(7.11/1)的草案:
空指针常量是一个整数字面值(5.13.2),其值为零,或者是类型为std :: nullptr_t的prvalue。
和21.2.3 / 2:
宏NULL是一个实现定义的空指针常量。
因此可以将NULL定义为nullptr。cppreference上也提到了这一点:
同时,“加法运算符”条款表示(8.5.6/7):
如果将值0添加到或从空指针值中减去,则结果是空指针值。如果两个空指针值相减,则结果与转换为类型std :: ptrdiff_t的值0相等。
因此,以下代码应该是有效的:
空指针常量是一个整数字面值(5.13.2),其值为零,或者是类型为std :: nullptr_t的prvalue。
和21.2.3 / 2:
宏NULL是一个实现定义的空指针常量。
因此可以将NULL定义为nullptr。cppreference上也提到了这一点:
#define NULL 0
//since C++11
#define NULL nullptr
同时,“加法运算符”条款表示(8.5.6/7):
如果将值0添加到或从空指针值中减去,则结果是空指针值。如果两个空指针值相减,则结果与转换为类型std :: ptrdiff_t的值0相等。
因此,以下代码应该是有效的:
0 + nullptr;
nullptr - nullptr;
但是由于std::nullptr_t
缺少+/-运算符,所以代码无效。
我有没有考虑到什么,或者NULL
宏实际上不能定义为nullptr
?
nullptr_t
和字面零之间的区别很重要。但是考虑到“或类型为std :: nullptr_t的prvalue”,您是否认为prvalue不是一个值?那是荒谬的。 - Cheers and hth. - Alfstd::nullptr_t
,它不是指针类型,因此没有基础来称其为“空指针值”(它根本不是指针值)。无论如何,“加法运算符”条款列出了可能参与加法运算符的类型,而std::nullptr_t
不是其中之一,因此无论您是否将std::nullptr
称为“空指针值”,std::nullptr - std::nullptr
都是无效的。 - n. m.