nullptr的出现是为了解决C++中重载特性混乱的问题.
1、重载特性混乱的原因
- 不同的c++compiler 会将
NULL定义为((void*)0或0从而导致调用函数foo(NULL)void foo(char *); void foo(int);会得到不同的结果
(但实际上foo(NULL)的调用方式在编译时是无法通过的) - c++不用许
void*隐式转换为其他类型2、解决方案
- 创造了
nullptr_t类型的nullptr,它可以隐式转换为任意指针类型,也可以进行等不等比较.3、实验
#include <iostream> void foo(char *); void foo(int); int main() { if(NULL == (void *)0) std::cout << "NULL == 0" << std::endl; else std::cout << "NULL != 0" << std::endl; foo(0); // foo(NULL); // 编译无法通过 foo(nullptr); return 0; } void foo(char *ch) { std::cout << "call foo(char*)" << std::endl; } void foo(int i) { std::cout << "call foo(int)" << std::endl; }在
g++ main.cpp -g -std=c++14 -o a.out命令编译compile,./a.out运行后得到NULL == 0 call foo(int) call foo(char*)所以为了更好的使用
c++函数重载特性要养成使用nullprt的习惯