今天在写一个程序的时候,想设置默认参数。其实本身想的和这个彷佛一点关系都没有。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
可是不一样编译器,会有不一样的处理方式,可能有的编译器就是能够编译。编译器