nullptr是类型安全的空指针字面量,而null本质是整数宏,易在重载解析、模板推导、constexpr上下文及跨平台中引发静默错误,应全面替换为nullptr。

因为 nullptr 是类型安全的空指针字面量,而 NULL 本质是整数(通常是 0 或 0L),在重载解析和模板推导中会引发意外行为。
重载函数调用时 NULL 会选错函数
当存在多个重载函数,一个接受指针、一个接受整数时,NULL 会被当作整数处理,导致调用非预期的重载版本。
常见错误现象:foo(NULL) 调用了 foo(int) 而不是 foo(char*),编译通过但逻辑出错。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 用
nullptr替换所有裸NULL字面量,尤其在函数调用上下文中 - 如果必须兼容旧代码,至少确保
NULL只出现在明确的指针赋值语句右侧(如int* p = NULL;),避免传参 - 现代 C++ 编译器(如 GCC 12+、Clang 14+)配合
-Wzero-as-null-pointer-constant可警告NULL的不安全用法
模板参数推导失败:NULL 不是真正的指针类型
模板函数无法从 NULL 推导出指针类型,因为 NULL 是整型常量表达式;nullptr 则有独立类型 std::nullptr_t,可隐式转换为任意指针类型。
使用场景:泛型容器初始化、智能指针构造、SFINAE 检测等。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 向模板函数传空指针时,必须写
func(nullptr),写func(NULL)可能触发编译错误或推导为int - 自定义模板中若需区分空指针与整数字面量,应显式接受
std::nullptr_t参数 -
std::shared_ptr<t> p(NULL)</t>在 C++11 后已弃用,正确写法是std::shared_ptr<t> p(nullptr)</t>
宏定义不稳定:不同头文件里 NULL 定义可能不同
NULL 是宏,标准只规定它扩展为“空指针常量”,但具体是 0、0L 还是 (void*)0 取决于实现和包含顺序。某些平台(如嵌入式)甚至用 (void*)0,导致与指针算术或 constexpr 上下文冲突。
性能 / 兼容性影响:宏展开可能干扰 constexpr 函数、内联判断,或在严格模式下触发警告(如 -Wold-style-cast)。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 不要在
constexpr表达式中使用NULL,它不是字面量常量;nullptr是 - 检查项目是否定义了
__cplusplus>= 201103L,确认已启用 C++11 或更高标准 - 用静态分析工具(如 clang-tidy)配置
modernize-use-nullptr规则自动替换
最易被忽略的一点:即使代码看起来“运行正常”,NULL 在重载和模板中的歧义仍是静默隐患——它不会报错,但可能让接口语义失效,尤其在跨模块或升级 STL 后突然暴露。










