
在 C++98/03 中,NULL 通常被定义为 (void*)0 或简单地 0。但是,使用 0 作为空指针常量有一个问题:0 既可以表示整数零,也可以表示空指针。这可能导致在重载函数的上下文中产生歧义。
例如:
void foo(int);
void foo(void*);
foo(NULL); // 在 C++98/03 中,这可能会导致歧义,因为 NULL 可能被解释为 int 或 void*C++11 引入了 nullptr 关键字,它是一个指针字面量,专门用来表示空指针。它的类型是 std::nullptr_t,这是一个新的内置类型,可以隐式转换为任何指针类型,但不能转换为非指针类型(如整数)。因此,使用 nullptr 可以消除上述的歧义。
void foo(int);
void foo(void*);
foo(nullptr); // 在 C++11 中,这将明确地调用 void foo(void*)引入 nullptr 的主要目的是解决使用 NULL 或 0 时可能产生的歧义,并提供一个更清晰、更明确的空指针常量表示。此外,nullptr 还与 C++ 的其他语言特性(如模板和类型安全)更好地集成,从而提高了代码的安全性和可靠性。
总之,nullptr 是 C++11 中引入的一个非常有用的关键字,它应该被用作空指针常量的首选表示方式。在编写新的 C++ 代码时,建议使用 nullptr 替代 NULL 或 0。