为什么不调用nullptr NULL?

时间:2015-08-31 00:46:27

标签: c++ c++11 language-design

在C ++ 11中, Typeface font = Typeface.createFromAsset(getAssets(),"fonts/TTMastersDEMOBlack.ttf"); 关键字被添加为更安全的空指针常量,因为先前nullptr的常见定义为0有一些问题。

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

7 个答案:

答案 0 :(得分:69)

Stephan T. Lavavej(C ++标准委员会成员)在talk(55:35)中解释过:

虽然允许实现#define NULL nullptr,但它会破坏一些用途,例如

int i = NULL;

显然有很多这些。所以他们无法强迫改变。

答案 1 :(得分:40)

nullptr指针类型,而NULL倾向于是整数,有时候在重载函数中,你需要清楚你正在使用指针而不是整数 - 这是nullptr派上用场的时候。

因此,要真正回答您的问题,NULLnullptr用于不同的目的,并将其重新定义到另一个可能会破坏已存在的代码库中的许多内容。

除此之外,

Bjarne Stroustrup's website

查看
  

我应该使用NULL还是0?

     

在C ++中,NULL的定义是0,所以只有美学   区别。我更喜欢避免宏,所以我使用0.另一个问题   NULL是人们有时会错误地认为它是不同的   从0开始和/或不是整数。在预标准代码中,NULL是/   有时被定义为不合适的东西,因此必须/必须   避免。这些日子不太常见。如果必须命名null   指针,称之为nullptr;这就是它在C ++ 11中所称的内容。然后,   " nullptr"将是一个关键字。

答案 2 :(得分:8)

如果没有真正参与标准委员会的讨论,很难肯定地说,但我认为因为它会破坏一些使用NULL的代码{{1}没有足够的兼容性。打破旧代码永远不是一个好主意。

答案 3 :(得分:8)

NULL不是类型安全的。由于历史原因,它在没有强制转换的情况下被定义为0,并且编译器将对于此特殊零点上的转换数量的警告静默警告。

即时,你可以这样做:

void* p = 0;

但没有隐式演员而不是这个:

void* p = 1234;

副作用是它可以作为数字值被滥用,正如其他答案所提到的那样。

nullptr通过强制执行它是一个指针来改进它,你不能将它赋给一个整数。 由于行为已更改,因此会创建一个新名称以实现向后兼容。

另请注意,nullptr由编译器处理,其实际值不会向用户公开(在NULL的情况下为零)。拥有与体系结构相关的值(比如0xdeadbeef)要容易得多,而不会影响程序员的代码逻辑。

答案 4 :(得分:2)

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

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

或声明NULL应该是#definednullptr

标准委员会允许NULL#definednullptr,但不需要它。

  

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

     

C ++ 11 4.10指针转换[conv.ptr] / 1 :   空指针常量是整数类型的整数常量表达式(5.19)prvalue,其求值为零或类型为std::nullptr_t的prvalue。

此处不关注向后兼容性,假定它是整数NULL的形式的0的任何使用都不符合标准。实施可能会选择不这样做来宽恕这种邪恶的行为。

答案 5 :(得分:2)

我将演示一种情况,即将nullptr定义为不同类型的决定有助于防止错误。

考虑以下功能:

void foo(int);
void foo(char *);

int main()
{
    foo(NULL); // oops
}

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

但是如果你打电话给 foo(nullptr),它会调用正确的 - foo(char *)

答案 6 :(得分:1)

引入NULL是为了安全性和清晰度(可能是使用NULL停止非指针类型的初始化)。

nullptr(int类型)不会更改为C:\folder1\dirs1.txt: folder2\dirs1.txt folder2\dirs2.txt folder3\dirs1.txt C:\folder1\folder2\dirs1.txt: folder4\dirs1.txt folder4\dirs2.txt (指针类型)以避免混淆并确保向后兼容性。

因此,标准委员会的思路可能与从旧记法到新记法的平滑过渡有关,而不会引起歧义或制止任何现有的代码。