use*_*751 67 c++ language-design c++11
在C++ 11中,nullptr关键字被添加为更安全的类型指针常量,因为先前的通用定义NULL为0有一些问题.
为什么标准委员会选择不调用新的空指针NULL,或者声明NULL应该是#defined nullptr?
Bau*_*gen 70
Stephan T. Lavavej(C++标准委员会成员)在一次演讲(55:35)中解释说:
虽然允许实现#define NULL nullptr,但它会破坏相当多的用途
int i = NULL;
Run Code Online (Sandbox Code Playgroud)
显然有很多这些.所以他们无法强迫改变.
Kil*_*eux 41
nullptr是指针类型,虽然NULL倾向于是整数,有时在重载函数中,你需要清楚你正在使用指针而不是整数 - 这就是nullptr派上用场的时候.
因此,要真正回答您的问题,NULL并nullptr为不同的目的服务并重新定义彼此可能会在已经存在的代码库中打破很多东西.
除此之外,
我应该使用NULL还是0?
在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.如果必须命名空指针,则将其命名为nullptr; 这就是它在C++ 11中所称的内容.然后,"nullptr"将是一个关键字.
NULL不是类型安全的.由于历史原因,它在没有强制转换的情况下被定义为0,并且编译器将对于此特殊零点上的转换数量的警告静音.
对于即时,你可以这样做:
void* p = 0;
Run Code Online (Sandbox Code Playgroud)
但是如果没有隐式转换,请注意
void* p = 1234;
Run Code Online (Sandbox Code Playgroud)
副作用是它可以作为数字值被滥用,正如其他答案所提到的那样.
nullptr通过强制执行它是一个指针来改进它,你不能将它赋给一个整数.由于行为已更改,因此会为向后兼容性创建新名称.
另请注意,nullptr由编译器处理,其实际值不向用户公开(如果为零则为零NULL).例如0xdeadbeef,在不影响程序员的代码逻辑的情况下,拥有与体系结构相关的值要容易得多.