最近玩了兩天的c++11,其中有一個是新的關鍵字nullptr。 這裡討論下nullptr的存在價值,應用場景以及不支持c++11的時候如何模擬nullptr。 1、為什要有nullptr 我們給一個指針賦初值的時候一般這麼寫 FILE* fp = NULL; 這裡有個NULL的定義,一般情況下它是這麼定義的: [cpp] #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif 在c語言環境下,由於不存在函數重載等問題,直接將NULL定義為一個void*的指針就可以完美的解決一切問題。 但是在c++環境下情況就變得復雜起來, 首先我們不能寫這樣的代碼 FILE* fp = (void*)0; 將void*直接賦值給一個指針是不合法的,編譯器會報錯。 我們只能這樣寫代碼 [cpp] FILE* fp = (FILE*)0; // or FILE* fp = 0; 所以在c++下面,NULL就被直接定義為一個整型 0。 在大多數情況下這並不會產生什麼問題,但是萬一有重載或者模板推導的時候,編譯器就無法給出正確結果了。比如下面的情形: [cpp] void call_back_process(CCObject* target, void* data); bind(call_back_process, target, NULL); // error 函數類型是void* ,但是我們綁定的是一個整型 0 2、 nullptr的應用場景: 如果我們的編譯器是支持nullptr的話,那麼我們應該直接使用nullptr來替代NULL的宏定義。正常使用過程中他們是完全等價的。 3、模擬nullptr的實現: 某些編譯器不支持c++11的新關鍵字nullptr,我們也可以模擬實現一個nullptr [cpp] www.2cto.com const class nullptr_t_t { public: template<class T> operator T*() const {return 0;} template<class C, class T> operator T C::*() const { return 0; } private: void operator& () const; } nullptr_t = {}; #undef NULL #define NULL nullptr_t