为什么不调用nullptr NULL?

在C ++ 11中, nullptr关键字被添加为更多types的安全空指针常量,因为之前将NULL定义为0的常见定义存在一些问题。

为什么标准委员会select不调用新的空指针常量NULL ,或者声明NULL应该是#define d到nullptr

Stephan T. Lavavej(C ++标准委员会成员)解释说,一旦谈话 (55:35):

虽然允许一个实现#define NULL nullptr ,它会打破一些像使用

 int i = NULL; 

显然有很多。 所以他们不能强迫改变。

nullptr指针types的 ,而NULL的趋势是整数,有时在重载的函数,你需要清楚你正在使用一个指针而不是一个整数 – 这是当nullptr派上用场。

所以要真正回答你的问题, NULLnullptr服务于不同的目的,重新定义一个到另一个可能会破坏已经存在的代码库中的很多东西。

除此之外,

从Bjarne Stroustrup的网站上查看

我应该使用NULL还是0?

在C ++中,NULL的定义是0,所以只有一个美学的区别。 我宁愿避免macros,所以我使用0. NULL的另一个问题是人们有时错误地认为它是从0和/或不是一个整数不同。 在预标准代码中,NULL有时被定义为不合适的东西,因此必须避免。 这些日子不太常见。 如果你必须命名空指针,则称它为nullptr; 这就是它在C ++ 11中所称的。 那么,“nullptr”将是一个关键字。

没有真正坐在标准委员会的讨论,很难肯定地说,但我会想,因为它会打破一些使用NULL代码,在nullptr不足够兼容的意义。 破旧的代码从来不是一个好主意。

NULL不是types安全的。 由于历史的原因,它被定义为0而没有强制转换,并且编译器会将强制转换号码的静音警告指向这个特殊的零。

瞬间,你可以做:

 void* p = 0; 

但不是没有隐含的铸造:

 void* p = 1234; 

副作用是可以被滥用作为数字值,如其他答案所述。

nullptr通过强制这是一个指针来改善这一点,你不能把它分配给一个整数。 由于行为被改变,为了向后兼容性创build一个新的名字。

还要注意的是, nullptr是由编译器处理的,它的实际值不会暴露给用户(在NULL情况下就像零)。 在不影响程序员的代码逻辑的情况下,具有依赖于架构的值比如0xdeadbeef要容易得多。

为什么标准委员会select不调用新的空指针常量NULL

大概是因为新的空指针是一个关键字,关键字不能被#defined ,所以调用它NULL将包含任何C头可能不合格。

或者声明NULL应该被#definednullptr

标准委员会确实允许将NULL #definednullptr ,但不要求它。

C ++ 11 18.2types[support.types] / 2 :macrosNULL是本标准中实现定义的C ++空指针常量。

C ++ 11 4.10指针转换[conv.ptr] / 1 :一个空指针常量是一个整数types的整型常量expression式(5.19),其值为零或std::nullptr_ttypes的一个prvalue。

向后兼容性在这里不是一个问题,任何假设它是一个整数0forms的NULL使用都不是标准一致的。 实施可能会select不这样做来宽恕这种恶行。

引入nullptr是为了安全和清晰(可能会停止使用NULL的非指针types的初始化)。

NULL (inttypes)不会更改为nullptr (指针types)以避免混淆并确保向后兼容性。

因此,标准委员会思路可能与从旧到新的符号的平滑过渡有关,而不会造成任何已经存在的代码的歧义或制动。

我将演示一个将nullptr定义为不同types的决定有助于防止错误的情况。

考虑这些function:

 void foo(int); void foo(char *); int main() { foo(NULL); // oops } 

在C ++ 98中,上面的代码调用了foo(int)函数,因为NULL被replace为0,这很可能不是你想要的。

但是如果你调用foo(nullptr),它会调用正确的一个 – foo(char *)