我们现在拥有具有许多新功能的 C++11。一个有趣且令人困惑的(至少对我而言)是新的 nullptr
。
好吧,不再需要讨厌的宏 NULL
。
int* x = nullptr;
myclass* obj = nullptr;
尽管如此,我还是不 nullptr
是如何工作的。例如, 维基百科文章 说:
C++11 通过引入一个新的 关键字 来作为一个可区分的空指针常量来纠正这个问题:nullptr。它的 类型为 nullptr_t ,可隐式转换并与任何指针类型或指向成员的指针类型相当。除了 bool 之外,它不能隐式转换或与整数类型相比较。
它如何是关键字和类型的实例?
另外,您是否还有另一个示例(除了维基百科),其中 nullptr
优于老旧的 0
?
原文由 Khaled Alshaya 发布,翻译遵循 CC BY-SA 4.0 许可协议
这并不奇怪。
true
和false
都是关键字,并且作为文字,它们具有类型(bool
)。nullptr
是std::nullptr_t
类型的 _指针文字_,它是一个纯右值(你不能使用&
它的地址)。4.10
关于指针转换说类型的prvaluestd::nullptr_t
是一个空指针常量,并且一个整数空指针常量可以转换为std::nullptr_t
。不允许相反的方向。这允许为指针和整数重载函数,并传递nullptr
来选择指针版本。传递NULL
或0
会混淆地选择int
版本。将
nullptr_t
转换为整数类型需要reinterpret_cast
,并且与(void*)0
转换为整数类型具有相同的语义(映射实现已定义)。 Areinterpret_cast
不能将nullptr_t
转换为任何指针类型。如果可能,请依赖隐式转换或使用static_cast
。该标准要求
sizeof(nullptr_t)
是sizeof(void*)
。