条款08:优先选用nullptr,而非0和NULL

📅 2026/6/16 1:18:58
条款08:优先选用nullptr,而非0和NULL
条款08优先选用nullptr而非0和NULLPrefernullptrto0 and NULL为什么优先选用nullptrC11 引入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模板与类型推导templatetypename 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_castint*(nullptr); // 显式转换罕见需求总结新代码一律使用nullptr。旧代码迁移逐步替换NULL和0的指针用法。类型安全编译器会阻止nullptr误用于非指针场景。通过统一使用nullptr能显著提升代码的可读性和安全性减少潜在的运行时错误。