C++为什么重新定义了nullptr

在 C++ 中,NULL 是一个宏,通常被定义为 0 或者 (void*)0。这种定义方式可能会导致一些问题,因为在某些情况下,编译器可能无法确定 NULL 到底是应该解释为整数 0 还是指针类型的 NULL。

例如,考虑下面的代码:

#include <iostream>

void foo(int i) {
  std::cout << "foo(int)" << std::endl;
}

void foo(void* ptr) {
  std::cout << "foo(void*)" << std::endl;
}

int main() {
  foo(NULL);
  return 0;
}

这个程序调用了函数 foo,并将 NULL 作为参数传递。根据定义,NULL 应该被解释为指针类型的 NULL。然而,由于 foo 函数重载了 int 和 void* 两个参数类型的版本,编译器无法确定 NULL 应该被解释为哪一种类型。这种情况下,代码的行为是未定义的,可能会产生错误的结果。

为了解决这个问题,C++ 11 引入了 nullptr。nullptr 是一个关键字,它被定义为一个右值空指针常量。因此,无论在哪种情况下,nullptr 都被解释为指针类型的 NULL,不会产生二义性,避免了上面提到的问题。

原文链接:,转发请注明来源!