在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