1. NULL的問題
在nullptr
被提出之前挂签,空指針通常被賦值為NULL
,其是由編譯器定義的宏盼产,一般為0
或者(void*)0
饵婆。即空指針是值為0的指針。
因此在將空指針傳入重載函數(shù)時戏售,有時會產(chǎn)生二義性的問題侨核,見下例
void func(int);
void func(char *);
func(NULL); // ambiguous,由于NULL定義為整數(shù)0并可指代空指針灌灾,
// 編譯器將不確定此處是調(diào)用func(int) 還是 func(char *);
對于這種二義性問題搓译,曾經(jīng)只能通過顯式轉(zhuǎn)換來解決。
func((char*)NULL); // 調(diào)用到func(char *);
2. nullptr的提出
為了解決上述歷史遺留問題锋喜,需要將空指針類型與整數(shù)類型區(qū)分開些己,因此提出了一個新的右值常量nullptr
豌鸡。
nullptr
是C++11中新增的一個關(guān)鍵字,用以指定為一個不能被取址的右值常量段标,以取代NULL
涯冠。
nullptr
的類型為decltype(nullptr)
,并在<cstddef>
中typedef
為nullptr_t
(因此nullptr_t
類型變量的值都為nullptr
)逼庞。
nullptr_t
類型的變量蛇更,被規(guī)定為只能被轉(zhuǎn)換為指針類型(包括函數(shù)指針、成員指針等)赛糟,而不能被轉(zhuǎn)換為整數(shù)派任、布爾等其他類型。
char *p = nullptr; // ch的值為空指針
int n = nullptr; // error璧南,nullptr不能被轉(zhuǎn)換為int類型
PS. 有一點特殊的是掌逛,因為空指針仍然能被賦值為NULL(0)
,所以為了向后兼容穆咐,使用nullptr
與常量0或者值為0的指針類型進行比較是允許并相等的颤诀,但是不被允許與值為0的其他類型相比較字旭。
nullptr == 0 // ok
char *p = NULL;
p == nullptr // ok
int i = 0;
i == nullptr // error
參考資料: