在C++的世界中字面值0用来表示空指针,因此0能够看成全部指针类型的字面值。为了让语义更明确引入了NULL
宏定义:函数
#undef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
这说明了在C++中,NULL
是被替换为0的(在一些实现中NULL
可能被定义为0L),这是由于C++不容许void
指针隐式转换为其它类型指针,可是容许0做为各指针类型的字面值常量。
这样作虽然能用,可是却有些小缺点:1.每次使用NULL
以前都须要确保引入了该宏定义,通常引入<cstddef>
头文件;2.有些场景会遇到麻烦:指针
void func(char *str) { printf("char *"); } void func(int n) { printf("int"); } int main() { func(NULL); return 0; }
这里原本是想调用func(char *)
版本的函数,但实际上调用的倒是func(int)
版本。特别是一些实现将NULL
定义为0L的,这里编译会报二义性错误。code
为此,C++11引入了一个新的关键字nullptr
,特地起个新名字就是为了兼容以前使用NULL
的代码。nullptr
是有类型的,而且该类型的定义来自于nullptr
自己:编译
typedef decltype(nullptr) nullptr_t;
nullptr
完美地解决了上面遇到的两种问题。class