nullptr是C++11引入的空指针字面量,类型为std::nullptr_t,专用于指针,避免与整型混淆;NULL是传统宏,常定义为0,易引发类型推导错误和重载歧义;应优先使用nullptr以提升类型安全和代码清晰性。

nullptr 是 C++11 引入的一个关键字,用来表示空指针,而 NULL 是传统 C 和 C++ 中用于表示空指针的宏。它们在语义和使用上存在关键区别,主要体现在类型安全和函数重载解析方面。
类型安全性不同
NULL 通常被定义为整数 0 或 (void*)0(在 C++ 中一般为 0),本质上是一个整型常量。这意味着在类型推导和函数重载时,NULL 可能被当作整数处理,从而引发歧义。
nullptr 是一个独立的字面量,其类型为 std::nullptr_t,专门用于表示空指针。它只能隐式转换为指针类型,不会与整数类型混淆。
例如:void func(int);
void func(char*);
func(NULL); // 调用 func(int),因为 NULL 是 0,优先匹配整型
func(nullptr); // 调用 func(char*),因为 nullptr 是指针类型
模板推导更准确
在模板编程中,使用 NULL 可能导致类型推导错误。
立即学习“C++免费学习笔记(深入)”;
示例:template
void foo(T* ptr) { }
foo(NULL); // T 被推导为 int,但语义上我们希望它是某种指针类型
foo(nullptr); // T 被正确推导为指针所指类型,更安全
避免潜在的重载歧义
当函数重载涉及整型和指针类型时,传入 NULL 可能导致编译错误或调用非预期的函数。
例如:void bar(int);
void bar(void*);
// bar(NULL); // 错误:调用不明确,两个函数都匹配
bar(nullptr); // 明确调用 bar(void*)
使用 nullptr 可以消除这种歧义,使代码意图更清晰。
建议使用 nullptr 替代 NULL
在 C++11 及以后的标准中,应优先使用 nullptr 来表示空指针。它更安全、语义更明确,能避免因类型混淆导致的错误。NULL 虽仍可使用,但已逐渐被 nullptr 取代。
基本上就这些 —— nullptr 是为指针而生的空值字面量,而 NULL 是一个容易被误用的整型宏。用 nullptr,代码更健壮。










