nullptr解決了什麼問題

從0到NULL

在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

從NULL到nullptr

爲此,C++11引入了一個新的關鍵字nullptr,特地起個新名字就是爲了兼容以前使用NULL的代碼nullptr是有類型的,而且該類型的定義來自於nullptr自己:編譯

typedef decltype(nullptr) nullptr_t;

nullptr完美地解決了上面遇到的兩種問題。class

相關文章
相關標籤/搜索