Null-Pointer-Const|Language|2013-07-13
早在 1972 年,常量0
就扮演着整型常量和空指针常量的双重身份。为了解决0
的二义性,C 使用预处理宏NULL
表示空指针,一般被定义为((void*)0)
或者0
。 C++ 与 C 不同,只允许 0 作为空指针常量。这样会使函数重载不好交互(interacts poorly):
void foo(char *);
void foo(int);
如果NULL
定义为0
,foo(NULL);
将会调用foo(int)
,这通常不是程序员所期待的行为,也违反了代码的直观性。
C++11 通过引入一个新的关键字来纠正这个问题,用来标志空指针常量: nullptr
。它的类型是nullptr_t
(用来隐式转换到任何指针或者成员指针(pointer-to-member)类型,不能转换成整型类型,除了 bool)。
为了向后兼容,0
依旧是一个空的指针常量。
char *pc = nullptr; // ok
char *pi = nullptr; // ok
bool b = nullptr; // ok, b is false
int i = nullptr; // error
foo(nullptr); // call foo(char *), not foo(int);