欢迎光临
我们一直在努力

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

条款08:优先选用nullptr,而非0和NULL(Prefer nullptr to 0 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,能显著提升代码的可读性和安全性,减少潜在的运行时错误。

赞(0)
未经允许不得转载:171主机测评 » 条款08:优先选用nullptr,而非0和NULL
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址