今天在寫一個程序的時候,想設置默認參數。其實本身想的和這個彷佛一點關係都沒有。ios
不過不重要。重點是瞭解了一些東西。c++
在c++11中引入了nullptr,由於NULL會引發二義性。因此就不要用NULL,用nullptr不會引發二義性。spa
//g++ nullAndNullptr.cpp -std=c++11 #include <iostream> using namespace std; void foo(int i){ printf("foo(int i)"); } void foo(char*p){ printf("foo(char*p)"); } int main(){ foo(nullptr); foo(NULL); return 0; } // nullAndNullptr.cpp: In function ‘int main()’: // nullAndNullptr.cpp:14:10: error: call of overloaded ‘foo(NULL)’ is ambiguous // foo(NULL); // nullAndNullptr.cpp:14:10: note: candidates are: // nullAndNullptr.cpp:4:6: note: void foo(int) // void foo(int i){ // nullAndNullptr.cpp:8:6: note: void foo(char*) // void foo(char*p){
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
咱們能夠看到在c++中NULL只是0,在c中NULL是((void*) 0)c++11
聽說是由於(void*) 轉換到(char*)和轉換到int的路徑同樣長。編譯器所以就產生了二義性。code
可是不一樣編譯器,會有不一樣的處理方式,可能有的編譯器就是能夠編譯。編譯器