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

可是不一样编译器,会有不一样的处理方式,可能有的编译器就是能够编译。编译器

相关文章
相关标签/搜索