nullptr 是 c++11 引入的类型安全空指针字面量,类型为 std::nullptr_t,可隐式转换为任意指针类型但不可转为整数;而 null 本质是整数 0 或 void* 宏,易导致重载误选和模板推导失败。

nullptr 是什么,它和 NULL 有啥本质区别
nullptr 是 C++11 引入的字面量,类型为 std::nullptr_t,专用于表示空指针。它不是整数,也不是宏,而是一个独立的、类型安全的空指针值。
NULL 在大多数实现里只是 0 或 ((void*)0) 的宏定义,问题在于:
- 当重载函数同时接受
int和char*时,传NULL可能意外匹配到int版本 - 模板推导中,
NULL常被当作整型,导致T*推导失败
比如这个常见陷阱:
void foo(int) { }
void foo(char*) { }
foo(NULL); // 调用 foo(int),不是你想的 char* 版本而 foo(nullptr) 明确调用 foo(char*)。
立即学习“C++免费学习笔记(深入)”;
什么时候必须用 nullptr,不能用 0 或 NULL
- 模板函数里需要明确推导出指针类型时
- 函数重载中要确保选中指针版本而非整型版本
- 使用
auto 初始化指针变量时
auto 初始化指针变量时 这些场景下用 0 或 NULL 都可能让编译器“猜错”类型:
-
auto p = nullptr;→p类型是std::nullptr_t(可隐式转成任意指针) -
auto p = 0;→p类型是int,后续赋给指针会报错 -
auto p = NULL;→ 取决于实现,可能是int或void*,行为不一致
nullptr 的类型和隐式转换规则
std::nullptr_t 是个空类类型,只有一种值:nullptr。它能隐式转换为任意原始指针类型(int<em></em>、MyClass 等),也能转成 bool(结果为 false),但不能转成整数类型。
这意味着:
-
if (p == nullptr)安全,且比p == 0更清晰 -
return nullptr;在返回指针的函数中是标准写法 -
nullptr + 1是非法的——它不是整数,不支持算术运算 -
sizeof(nullptr)不是 0,通常和指针大小一致(如 8 字节)
兼容性和实际迁移建议
C++11 起所有主流编译器都支持 nullptr。如果你的项目已启用 C++11 或更高标准,就该全面替换 NULL 和裸 0 作为空指针字面量。
但注意几个易忽略点:
- 不要在 C 头文件里用
nullptr(C 不认识它),混合 C/C++ 项目中头文件接口仍需用NULL或宏抽象 -
nullptr不能用于非指针的 void* 参数(比如某些系统 API 要求void*,而你传nullptr可能触发模板/重载歧义) - 旧代码里
#define NULL 0的自定义定义,会和nullptr并存,但别试图把nullptr#define 成别的东西——它不是宏
最常被忽略的是:nullptr 不是万能解药。它解决的是空指针的类型安全问题,但不会帮你避免解引用空指针——那得靠逻辑检查或智能指针。










