应使用 nullptr 而非 NULL 或 0:因 NULL 和 0 是整型,重载时易误匹配 int 版本;nullptr 类型为 std::nullptr_t,只匹配指针重载,且具备类型安全、编译期检查、语义清晰等优势。
函数重载时调用哪个版本?这是最常踩的坑
当你写 func(NULL),编译器大概率会选 func(int) 而不是 func(char*)——哪怕你本意是传空指针。因为 NULL 本质就是整数 0,而 0 是更匹配 int 的精确类型。
换成 func(nullptr) 就没歧义了:它只能转成指针,所以直接绑定到 func(char*)。
-
NULL在重载中可能“悄悄”走错分支,bug 难复现、难调试 -
nullptr让重载解析结果可预测,且编译期报错(比如没有匹配的指针重载),比运行时逻辑错更早暴露问题 - 尤其注意带
std::string、const char*、int混合重载的 API,NULL极易误入字符串构造或整型分支
模板推导出什么类型?auto 和容器键值很敏感
写 auto p = NULL;,推导结果是 int;而 auto q = nullptr; 推导出的是 std::nullptr_t——这直接影响后续赋值、比较甚至 SFINAE 判定。
例如:std::map m;,你想查空指针:m.find(nullptr) 合法;但 m.find(0) 或 m.find(NULL) 会编译失败,因为 0 和 NULL 是 int,和 int* 类型不匹配。
立即学习“C++免费学习笔记(深入)”;