我知道在c++中,基于指针的应用程序中的0x或NULL被nullptr所取代。我只是好奇他们为什么要做这个替换?
0x
NULL
nullptr
在什么情况下,在处理指针时使用nullptr而不是NULL是有益的?
一个原因是:字面量0有获得类型int的坏倾向,例如在完全参数转发中或更一般地作为模板类型的参数。
0
int
另一个原因是:代码的可读性和清晰度。
这里是Bjarne Stroustrup说,
在c++中,NULL的定义是0,所以只有美学上的区别。我更喜欢避免宏,所以我使用0。NULL的另一个问题是,人们有时会错误地认为它不同于0和/或不是整数。在标准之前的代码中,NULL有时被定义为不合适的东西,因此必须避免使用。现在这种情况不常见了。 如果你必须给空指针命名,叫它nullptr;这就是 它在c++ 11中被称为。然后,"nullptr"将是一个关键字
在c++中,NULL的定义是0,所以只有美学上的区别。我更喜欢避免宏,所以我使用0。NULL的另一个问题是,人们有时会错误地认为它不同于0和/或不是整数。在标准之前的代码中,NULL有时被定义为不合适的东西,因此必须避免使用。现在这种情况不常见了。
你可以通过阅读空指针的名称:nullptr找到一个很好的解释为什么它被取代,引用论文:
这个问题可以分为以下几类: 改进对库构建的支持,为用户提供一种方法来编写更少的模糊代码,这样随着时间的推移,库编写者将不需要担心整型和指针类型的重载。 改进对泛型编程的支持,使整数0和nullptr更容易明确地表达。 让c++更容易教和学。
这个问题可以分为以下几类:
nullptr具有类型std::nullptr_t。它可以隐式转换为任何指针类型。因此,它将匹配std::nullptr_t或重载解析中的指针类型,但不匹配其他类型,如int。
std::nullptr_t
0(又名。C的NULL桥接到c++)可能会导致重载函数解析的模糊性,其中包括:
f(int); f(foo *);
(感谢Caleth在评论中指出这一点。)