为什么不调用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
派上用场。
所以要真正回答你的问题, NULL
和nullptr
服务于不同的目的,重新定义一个到另一个可能会破坏已经存在的代码库中的很多东西。
除此之外,
从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
应该被#defined
为nullptr
?
标准委员会确实允许将NULL
#defined
为nullptr
,但不要求它。
C ++ 11 18.2types[support.types] / 2 :macros
NULL
是本标准中实现定义的C ++空指针常量。C ++ 11 4.10指针转换[conv.ptr] / 1 :一个空指针常量是一个整数types的整型常量expression式(5.19),其值为零或
std::nullptr_t
types的一个prvalue。
向后兼容性在这里不是一个问题,任何假设它是一个整数0
forms的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 *) 。