nullptr是唯一安全的空指针字面量,因null本质是整数0,导致重载解析错误、模板推导偏差及隐式类型转换隐患,而nullptr具备严格类型安全与编译期检查能力。

现代 C++ 代码里,nullptr 是唯一应该用的空指针字面量;NULL 本质是整数 0,在函数重载、模板推导和类型检查中会悄悄出错。
为什么 func(NULL) 会调用 int 版本而不是指针版本
因为 NULL 在 C++ 中几乎总是被定义为 0(不是 (void*)0),它是个纯整数。编译器做重载解析时,把 0 当作 int 匹配,比转换成指针更“便宜”。
-
void func(int)和void func(char*)同时存在时,func(NULL)实际调用的是func(int) -
func(nullptr)则严格匹配指针重载,不会模棱两可 - 这种错误在运行时才暴露逻辑偏差,编译期不报错,极难排查
int a = NULL; 能编译通过,但 int a = nullptr; 会报错
NULL 可隐式转成任意整数类型,而 nullptr 只能转成指针或 bool。这是类型安全的分水岭。
-
int x = NULL;合法 → 但语义混乱:你真想存一个“空指针”还是“数字 0”? -
int y = nullptr;编译失败 → 强制你意识到:这东西不该当整数用 - 同理,
if (p == NULL)看似没问题,但if (p == nullptr)更准确,且防止p是自定义类型时意外触发 operator== 的整数分支
模板里传 NULL 和 nullptr 推导结果完全不同
模板参数推导依赖实参类型。NULL 是 int,nullptr 是 std::nullptr_t,推导出的 T 完全不同。
-
template<typename t> void f(T t) { }</typename>中,f(NULL)→T是int -
f(nullptr)→T是std::nullptr_t,后续可安全转为任意指针类型 - 如果模板内部做了
static_cast<t>(...)</t>,用NULL就直接崩了
真正麻烦的不是写错一次,而是 NULL 在多数简单场景下“恰好能跑”,掩盖了类型歧义;等逻辑变复杂、加模板、上重载,问题才集中爆发。用 nullptr 不是“多此一举”,是提前堵住隐性漏洞的最小成本操作。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











