NULL vs nullptr(为什么它被替换?)

我知道在c++中,基于指针的应用程序中的0xNULLnullptr所取代。我只是好奇他们为什么要做这个替换?

在什么情况下,在处理指针时使用nullptr而不是NULL是有益的?

252073 次浏览

一个原因是:字面量0有获得类型int的坏倾向,例如在完全参数转发中或更一般地作为模板类型的参数。

另一个原因是:代码的可读性和清晰度。

这里是Bjarne Stroustrup说,

在c++中,NULL的定义是0,所以只有美学上的区别。我更喜欢避免宏,所以我使用0。NULL的另一个问题是,人们有时会错误地认为它不同于0和/或不是整数。在标准之前的代码中,NULL有时被定义为不合适的东西,因此必须避免使用。现在这种情况不常见了。

如果你必须给空指针命名,叫它nullptr;这就是 它在c++ 11中被称为。然后,"nullptr"将是一个关键字

你可以通过阅读空指针的名称:nullptr找到一个很好的解释为什么它被取代,引用论文:

这个问题可以分为以下几类:

  • 改进对库构建的支持,为用户提供一种方法来编写更少的模糊代码,这样随着时间的推移,库编写者将不需要担心整型和指针类型的重载。

  • 改进对泛型编程的支持,使整数0和nullptr更容易明确地表达。

  • 让c++更容易教和学。

nullptr具有类型std::nullptr_t。它可以隐式转换为任何指针类型。因此,它将匹配std::nullptr_t或重载解析中的指针类型,但不匹配其他类型,如int

0(又名。C的NULL桥接到c++)可能会导致重载函数解析的模糊性,其中包括:

f(int);
f(foo *);

(感谢Caleth在评论中指出这一点。)