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

Rip*_*de4 176 c++ null pointers nullptr

我知道在C++中0x或者NULLnullptr基于指针的应用程序所取代.我只是好奇他们为什么要更换它?

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

Joe*_*e Z 255

nullptr始终是指针类型. 0(又称.C的NULL桥接到C++中)可能导致重载函数解析的模糊性,以及其他:

f(int);
f(foo *);
Run Code Online (Sandbox Code Playgroud)

  • @ Cheersandhth.-Alf我不知道如何回答这个问题,除了我知道我在问什么,这是最容易理解的解释. (16认同)
  • @Riptyde4:Shafik的答案是恕我直言最全面的.那里的引用包括这个答案的"ambigious重载"和我的答案的"模板论证类型问题",加上它是一个很好的参考.这个答案只是其中一小部分原因. (8认同)
  • 挑剔:`nullptr` 的类型是 `std::nullptr_t`,它不是指针类型。`nullptr` 隐式转换为任何指针类型,重要的是“不”转换为任何整数类型。 (7认同)
  • 但我们始终可以使用 f( (int) NULL ) 或 f((foo*) NULL ) 等类型转换运算符指定类型作为解决歧义的替代方法...正确吗? (2认同)

Sha*_*our 60

你可以通过读取空指针的名称找到一个很好的解释原因:nullptr引用文章:

此问题分为以下几类:

  • 通过为用户提供编写较少模糊代码的方法来改进对库构建的支持,以便随着时间的推移,库编写者不必担心对整数和指针类型进行重载.

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

  • 使C++更容易教学和学习.


Dei*_*rei 33

这是Bjarne Stroustrup的措辞,

在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.

如果必须命名空指针,则将其命名为nullptr; 这就是它在C++ 11中所称的内容.然后,"nullptr"将是一个关键字.

  • @Quirliom:我认为这就是C++ 11中新关键字**nullptr**的原因 (5认同)
  • 这并没有真正回答这个问题,只给出了这个名字的来源...... (4认同)
  • @Sinkingpoint 是对的。这是答案的一部分,因为它解释了“NULL”的问题之一,但它没有解释“nullptr”如何避免该问题或为什么实际上引入了“nullptr”(这是OP提出的问题)实际上是在问)。 (3认同)

Che*_*Alf 12

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

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

  • 好吧,对于 NULL 类型,C++ 标准可以添加 std::nullptr_t 而不添加 nullptr,并定义 #define NULL ((std::nullptr_t) 0)`,类似于 POSIX 的做法在 C 语言中:`#define NULL ((void *) 0)`。您不需要新的关键字。 (3认同)
  • @hrfmobile:“NULL”是一个宏,通常可以定义为文字“0”(可能带有类型后缀)。在当前的 g++ 9.2 版本中,它被定义为内在的“__null”。在当前的 Visual C++ 2019 中,它被定义为普通的“0”。因此,我给出的第一个原因适用于*当*“NULL”被定义为文字时。第二个原因始终适用,但更为主观。然而,大多数人都认为全部大写是有碍观瞻、大喊大叫。这是宏使用命名约定的主要原因。 (2认同)
  • @alx我猜关键字的使用排除了非常流行的`#undef NULL / #define NULL <其他我认为比标准更好的东西>`,这可能会让任何在代码中查看`NULL`的人感到困惑以为它意味着一件事,但实际上它意味着另一件事。毕竟,“#define true ((bool)1)”有什么问题呢? (2认同)