C++ 为什么不调用nullptr NULL?
在C++11中,添加了C++ 为什么不调用nullptr NULL?,c++,c++11,language-design,C++,C++11,Language Design,在C++11中,添加了nullptr关键字作为类型更安全的空指针常量,因为以前常见的nullas 0定义存在一些问题 为什么标准委员会选择不调用新的空指针常量null,或者宣布null应该是#定义d到nullptr?而不参加标准委员会的讨论,很难说,但我会这样想,因为它会破坏一些使用NULL的代码,这意味着nullptr不够兼容。打破旧代码从来不是个好主意。 < P> Stephan T. Lavavej(C++标准委员会成员)解释说,曾经在(55∶35): 虽然允许实现定义NULL nullp
nullptr
关键字作为类型更安全的空指针常量,因为以前常见的null
as 0定义存在一些问题
为什么标准委员会选择不调用新的空指针常量
null
,或者宣布null
应该是#定义d到nullptr
?而不参加标准委员会的讨论,很难说,但我会这样想,因为它会破坏一些使用NULL
的代码,这意味着nullptr
不够兼容。打破旧代码从来不是个好主意。 < P> Stephan T. Lavavej(C++标准委员会成员)解释说,曾经在(55∶35):
虽然允许实现定义NULL nullptr
,但它会破坏许多用法,如
int i = NULL;
显然有很多这样的人。因此他们无法强制更改。nullptr
是指针类型,而NULL
倾向于整数,有时在重载函数中,您需要明确使用的是指针而不是整数-这是nullptr
派上用场的时候
因此,要真正回答您的问题,NULL
和nullptr
有两个不同的用途,将它们重新定义可能会破坏已经存在的代码库中的许多东西
除此之外,请检查以下内容:
我应该使用NULL还是0?
在C++中,NULL的定义是0,所以只有一个美学。
差别。我更喜欢避免使用宏,所以我使用0。另一个问题
空是指人们有时错误地认为它是不同的
从0和/或不是整数。在预标准代码中,NULL was/is
有时定义为不合适的东西,因此必须
避免。现在这种情况不太常见了。如果必须命名空值
指针,称之为nullptr;这就是它在C++11中的名称。那么,
“nullptr”将是一个关键字
NULL
不是类型安全的。由于历史原因,它被定义为0,但没有强制转换,编译器将发出强制转换数字的警告,指向此特殊零上的指针
目前,您可以执行以下操作:
void* p = 0;
但这不是没有隐式铸造的:
void* p = 1234;
副作用是,正如其他答案所提到的,它可以被滥用为数值
nullptr
通过强制它是指针来改进这一点,您不能将其分配给整数。
由于行为已更改,因此将创建一个新名称以实现向后兼容性
还要注意,NULL ptr
由编译器处理,它的实际值不向用户公开(如NULL
的情况下为零)。在不影响程序员的代码逻辑的情况下,更容易获得依赖于体系结构的值,比如0xdeadbeef
。引入nullptr
是为了类型安全和清晰(可能是为了使用NULL
停止非指针类型的初始化)
NULL
(int类型)未更改为NULL ptr
(指针类型),以避免混淆并确保向后兼容性
因此,标准委员会的思路可能与从旧符号到新符号的平稳过渡有关,而不会造成歧义或中断任何现有代码。为什么标准委员会选择不调用新的空指针常量null
可能是因为新的null指针是一个关键字,并且关键字不能定义为#
,所以调用它null
可能会导致包含任何C头的格式错误
或者声明应将NULL
定义为nullptr
?
标准委员会允许将NULL
定义为nullptr
,但不要求这样做
C++11 18.2类型[support.Types]/2:
宏<代码> null <代码>是本国际标准中定义的C++空指针常数。
C++11 4.10指针转换[conv.ptr]/1:
空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或类型为std::nullptr\u t
这里不关心向后兼容性,任何假定它是整数0
形式的NULL
的使用都不符合标准。实现可能会选择不这样做来宽恕这种邪恶行为。我将演示一个案例,其中将nullptr定义为另一种类型的决定有助于防止bug
考虑以下功能:
void foo(int);
void foo(char *);
int main()
{
foo(NULL); // oops
}
在C++98中,上面的代码调用foo(int)函数,因为NULL被0替换,这很可能不是您想要的
但是如果你调用foo(nullptr)它会调用正确的一个--foo(char*)我希望他们至少会反对这种说法,以便将来可以将NULL定义为nullptr。。。(或者说nullptr可以称为NULL,nullptr_t可以有一个不推荐使用的int转换)对于类似于int
的例子,我偶尔会遇到一些代码,其中有人用str[end_pos]=NULL来“NULL终止”字符串代码>inti=NULL代码>是而且一直都是邪恶的。你为什么要这样做?@TNA好吧,C在这方面是一种邪恶。这就像使用str[end\u pos]=NULL
或str[end\u pos]=0
,或者使用13
而不是\r
,例如,都是常用的。类型在C中不是什么大问题。。。另一个例子是被广泛误用的long
,尤其是与指针常规转换为int
或long
的方式相结合时。“发明”inti=NULL
的人可能会认为这是一种非常明显的方法