在C ++ 11中, Typeface font = Typeface.createFromAsset(getAssets(),"fonts/TTMastersDEMOBlack.ttf");
关键字被添加为更安全的空指针常量,因为先前nullptr
的常见定义为0有一些问题。
为什么标准委员会选择不调用新的空指针NULL
,或者声明NULL
应该是NULL
d到#define
?
答案 0 :(得分:69)
Stephan T. Lavavej(C ++标准委员会成员)在talk(55:35)中解释过:
虽然允许实现#define NULL nullptr
,但它会破坏一些用途,例如
int i = NULL;
显然有很多这些。所以他们无法强迫改变。
答案 1 :(得分:40)
nullptr
是指针类型,而NULL
倾向于是整数,有时候在重载函数中,你需要清楚你正在使用指针而不是整数 - 这是nullptr
派上用场的时候。
因此,要真正回答您的问题,NULL
和nullptr
用于不同的目的,并将其重新定义到另一个可能会破坏已存在的代码库中的许多内容。
除此之外,
查看我应该使用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
应该是#defined
到nullptr
?标准委员会允许NULL
为#defined
到nullptr
,但不需要它。
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
(指针类型)以避免混淆并确保向后兼容性。
因此,标准委员会的思路可能与从旧记法到新记法的平滑过渡有关,而不会引起歧义或制止任何现有的代码。