NULL 和nullptr區別

今天在寫一個程序的時候,想設置默認參數。其實本身想的和這個彷佛一點關係都沒有。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){

 

  1. 那是爲何呢?查看NULL的定義
    #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

可是不一樣編譯器,會有不一樣的處理方式,可能有的編譯器就是能夠編譯。編譯器

相關文章
相關標籤/搜索