条款08:优先选用nullptr,而非0和NULL(Prefernullptrto0 and NULL)
为什么优先选用nullptr
C++11 引入nullptr作为空指针字面量,解决了传统0和NULL在语义和类型安全上的缺陷。
传统问题
0本质是int类型,可能被隐式转换为整数或指针,导致重载歧义。NULL通常是0的宏定义(如#define NULL 0),存在相同问题。
nullptr的优势
- 类型安全:
nullptr是std::nullptr_t类型,仅能隐式转换为指针类型,避免整数误用。 - 重载解析更明确:编译器能正确区分指针和整数重载版本。
- 代码清晰:明确表达“空指针”意图,而非数值零。
使用示例
场景 1:避免重载歧义
void foo(int); // 重载1:接受整数 void foo(char*); // 重载2:接受指针 foo(0); // 调用 foo(int),可能不符合预期 foo(NULL); // 可能编译失败或调用 foo(int) foo(nullptr); // 明确调用 foo(char*)场景 2:模板与类型推导
template<typename T> void bar(T* ptr); bar(0); // 编译错误(T* 无法匹配 int) bar(nullptr); // T 推导为 void,或通过 static_cast 显式指定类型需要兼容旧代码时
若需与遗留代码(使用NULL或0)交互,仍可使用nullptr,因其能隐式转换为任何指针类型。反之则需显式转换:
int* p = nullptr; // 正确 int* q = NULL; // 兼容但非推荐 int* r = static_cast<int*>(nullptr); // 显式转换(罕见需求)总结
- 新代码:一律使用
nullptr。 - 旧代码迁移:逐步替换
NULL和0的指针用法。 - 类型安全:编译器会阻止
nullptr误用于非指针场景。
通过统一使用nullptr,能显著提升代码的可读性和安全性,减少潜在的运行时错误。