- 从语义角度来看,0代表int,并不是指针类型,而NULL则是宏,可能是int,也可能是long类型,取决于各个平台的实现。但是nullptr很清楚地表明:这是一个指针。
- 如果有2个重载(overload)函数:func(int)和func(A*),函数调用func(NULL)或func(0)会选择前者;如果将func(int)删除,编译器会自动将NULL或0转换成A*指针,进而调用func(A*)。如果调用func(nullptr),那么func(int)是不会被调用的,因为nullptr是指针类型,而不是int类型。
- NULL和0是有局限的,比如有以下模版函数:
void null_pointer_func(A* a){}
template<typename T>
void null_pointer_template_func(T value){
null_pointer_func(value);
}
null_pointer_template_func(NULL);//编译器会报错
null_pointer_template_func(0);//编译器会报错
//编译器不会报错,因为编译器做以下几件事情:
// 1. 将nullptr的类型T推导为std::nullptr_t,也就是value的类型
// 2. 当value传递给null_pointer_func时,编译器做了一次隐式转换:std::nullptr_t变成了A*
// 3. null_pointer_func(value);成功调用
null_pointer_template_func(nullptr);
#C++##求职##我的实习求职记录#