我知道在C++中,指针应用程序中的0x
或NULL
被nullptr
替代。我只是好奇他们为什么做出了这个更改的确切原因?
使用nullptr
而不是NULL
处理指针时,在哪种情况下会更有优势?
我知道在C++中,指针应用程序中的0x
或NULL
被nullptr
替代。我只是好奇他们为什么做出了这个更改的确切原因?
使用nullptr
而不是NULL
处理指针时,在哪种情况下会更有优势?
nullptr
的类型是 std::nullptr_t
。它可以隐式转换为任何指针类型。因此,在重载决议中,它将匹配 std::nullptr_t
或指针类型,但不会匹配其它类型,例如 int
。
0
(也就是 C 中的 NULL 被引入到 C++ 中)可能会在重载函数解析时导致歧义等问题:
f(int);
f(foo *);
(感谢Caleth在评论中指出这一点。)
nullptr
的类型为 std::nullptr_t
,它不是指针类型。nullptr
可以隐式地转换为任何指针类型,而且重要的是 不会 转换为任何整数类型。 - Caleth这个问题属于以下类别:
通过提供一种用户编写更少歧义代码的方式来改善库构建支持,以便随着时间的推移,库编写者不需要担心整数和指针类型的重载。
通过使表达整数0和nullptr变得明确易懂来改善通用编程的支持。
使C++更易于教学和学习。
C++中,NULL的定义是0,因此只有美学上的区别。我更喜欢避免使用宏,所以我使用0。另一个问题是人们有时错误地认为NULL与0不同和/或不是整数。在早期标准之前的代码中,NULL有时被定义为不合适的东西,因此必须避免使用。现在这种情况已经不太常见了。
如果你必须给null指针命名,请称其为nullptr;这就是C++11中的名称。然后,“nullptr”将成为关键字。
NULL
的一个问题,但它并没有解释 nullptr
如何避免这个问题,或者为什么实际上引入了 nullptr
(这些才是 OP 实际上在问的问题)。 - Pharap一个原因是:字面上的0
很容易取得类型int
,例如在完美参数转发或更一般地作为带有模板类型的参数中。
另一个原因是:代码的可读性和清晰度。
NULL
是一个宏,通常被定义为文字 0
(可能带有类型后缀)。在当前的 g++ 版本 9.2 中,它被定义为内部变量 __null
。在当前的 Visual C++ 2019 中,它被定义为普通的 0
。因此,我给出的第一个理由适用于NULL
被定义为文字的情况。第二个原因总是适用的,但更具主观性。然而,大多数人都认为全大写字母很丑陋,尖叫。这就是为什么宏使用这种命名约定的主要原因。 - Cheers and hth. - AlfNULL
类型,C++标准本可以添加std::nullptr_t
而不是添加nullptr
,并定义#define NULL ((std::nullptr_t) 0)
,类似于POSIX在C中所做的:#define NULL ((void *) 0)
。这样就不需要新的关键字了。 - alx - recommends codidact#undef NULL / #define NULL <something else I think is even better than the standard>
,这可能会让查看代码中的 NULL
的人误以为它意味着一件事情,而实际上它意味着另一件事情。毕竟,#define true ((bool)1)
有什么问题呢? - kbro