在C++标准中有一条特殊的规则,即NULL既是一个整型常量,又是一个空指针常量。NULL作为空指针常量还能隐式地转换为各种指针类型。
比如我们在初始化变量的时候经常看到的代码:
char *p = NULL;
int x = 0;
这里的NULL是一个宏,在C++11标准之前其本质就是0:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
这在C++的隐式转换中 NULL 可能更先被推导为 int。
C++11中添加关键字nullptr表示空指针的字面量,它是一个std::nullptr_t类型的纯右值。nullptr的用途非常单纯,就是用来指示空指针,它不允许运用在算术表达式中或者与非指针类型进行比较(除了空指针常量0)。它还可以隐式转换为各种指针类型,但是无法隐式转换到非指针类型。而 0 依然保留着可以代表整数和空指针常量的特殊能力,保留这一点是为了让C++11标准兼容以前的C++代码。
nullptr的出现消除了使用NULL带来的二义性,与此同时其类型和含义也更加明确。
含义明确的好处是,C++标准可以加入一系列明确的规则去限制nullptr的使用,这让程序员能更快地发现编程时的错误。
所以建议读者在编译器支持的情况下,总是优先使用nullptr而非NULL。