276

我知道在 C++ 中0x或者在基于指针的应用程序中NULL被替换。nullptr我只是好奇他们为什么要进行这个替换的确切原因?

在处理指针时,在什么情况下使用nullptr过度有益?NULL

4

4 回答 4

380

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

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

f(int);
f(foo *);

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

于 2013-12-11T03:09:43.913 回答
82

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

这个问题分为以下几类:

  • 改进对库构建的支持,为用户提供一种编写不那么模棱两可的代码的方法,以便库编写者随着时间的推移不必担心整数和指针类型的重载。

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

  • 使 C++ 更易于教授和学习。

于 2013-12-11T03:09:28.620 回答
58

这是Bjarne Stroustrup 的话,

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

如果必须给空指针命名,就叫它nullptr;这就是它在 C++11 中的名称。然后,“nullptr”将成为关键字。

于 2013-12-11T03:08:48.787 回答
17

一个原因:文字0具有获取类型的不良倾向int,例如在完美的参数转发中或更一般地作为具有模板类型的参数。

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

于 2013-12-11T03:06:47.590 回答