nullptr是现代c++中唯一应使用的空指针字面量;它消除了null导致的类型歧义、重载误匹配、模板推导失败及静态分析警告等问题,并要求迁移时同步修正所有裸0指针用法。

现代 C++ 项目中,nullptr 是唯一应使用的空指针字面量;NULL 应彻底弃用,无论它被定义为 0 还是 (void*)0 —— 它带来的类型歧义和模板推导失败,在真实项目里已经踩过太多坑。
函数重载时 NULL 会静默匹配错误版本
这是最典型、最容易漏掉的陷阱。编译器看到 NULL,优先按整数处理:
-
void func(int)和void func(char*)同时存在时,func(NULL)几乎总是调用int版本 - 即使
NULL被定义为(void*)0,C++ 标准也不允许void*隐式转成char*,所以仍可能退回到int版本 -
func(nullptr)则明确、唯一地绑定到指针重载,编译器不二选一
std::unique_ptr 和 std::function 构造必须用 nullptr
智能指针和可调用对象包装器依赖精确的模板参数推导,NULL 会破坏这一过程:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
std::unique_ptr<int> p = NULL;</int>→ 编译失败:没有从int到std::unique_ptr<int></int>的可行转换 -
std::function<void> f = NULL;</void>→ 同样失败:NULL推导为int,无法构造std::function -
std::function<void> f = nullptr;</void>→ 正确:nullptr可隐式转为std::function的空状态
静态分析工具会警告 NULL 在指针上下文中的使用
Clang 的 -Wzero-as-null-pointer-constant、GCC 的 -Wold-style-cast(配合 NULL 定义)都会对 NULL 报警:
- 报错示例:
comparison between NULL and integer或NULL used in integer context - 这类警告不是“建议”,而是明确指出:你写的代码在语义上就模棱两可
-
nullptr不触发此类警告,因为它天生只属于指针语义域
旧项目迁移时,别只改字面量,要检查所有 0 的指针用途
很多老代码直接写 int* p = 0;,这和 NULL 本质相同,同样危险:
- 搜索项目中所有
= 0;、== 0、!= 0出现在指针变量附近的位置 - 尤其注意条件判断:
if (ptr == 0)应统一改为if (ptr == nullptr)或更简洁的if (ptr) - 宏定义的
NULL(如自定义头文件里的#define MY_NULL 0)也必须一并清理
真正麻烦的不是语法替换,而是那些藏在模板特化、SFINAE 条件、或跨平台头文件里的隐式依赖——它们不会报错,但会让行为在不同编译器间漂移。用 nullptr 不是“升级语法”,而是把指针空值这个概念从整数沼泽里打捞出来,让它重新拥有自己的类型和尊严。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










