Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不调用nullptr NULL?_C++_C++11_Language Design - Fatal编程技术网

C++ 为什么不调用nullptr NULL?

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

在C++11中,添加了
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
的人可能会认为这是一种非常明显的方法