我们现在有了许多新特性的C++11。一个有趣和令人困惑的(至少对我来说)是新的nullptr。
嗯,不再需要讨厌的宏NULL了。
int* x = nullptr;
myclass* obj = nullptr;尽管如此,我还是不明白nullptr是如何工作的。例如,维基百科文章说:
C++11通过引入一个新的关键字来纠正这一点,作为一个可分辨的空指针常量: nullptr。它是类型的nullptr_t,它是隐式可转换的,可与任何指针类型或指针到成员类型相比较。它不是隐式可转换的或可与积分类型相比较的,但bool除外。
它如何成为关键字和类型的实例?
另外,你还有另外一个例子(维基百科的例子),nullptr比好的老0要好吗?
发布于 2009-08-15 17:06:52
它如何成为关键字和类型的实例?
这并不奇怪。true和false都是关键字,作为文本,它们都有一个类型( bool )。nullptr是std::nullptr_t类型的指针文本,它是一个prvalue (您不能使用&获取它的地址)。
4.10表示,std::nullptr_t类型的prvalue是一个空指针常量,并且可以将一个完整的空指针常量转换为std::nullptr_t。相反的方向是不允许的。这允许重载指针和整数的函数,并通过nullptr选择指针版本。传递NULL或0会令人困惑地选择int版本。nullptr_t转换为整体类型需要一个reinterpret_cast,其语义与将(void*)0转换为整体类型(映射实现定义)具有相同的语义。reinterpret_cast不能将nullptr_t转换为任何指针类型。如果可能的话,依赖于隐式转换或使用static_cast。sizeof(nullptr_t)为sizeof(void*)。发布于 2018-03-07 06:18:31
为什么在C++11中使用nullptr?那是什么?为什么NULL是不够的?
C++ expert 亚历克斯·阿兰说得很完美 (我的重点在黑体字中添加):
...imagine有以下两个函数声明: void (Int n);void (char *s);func( NULL );//猜猜哪个函数被调用? --尽管它看起来像第二个函数将被调用--毕竟,您传递的似乎是一个指针--它确实是第一个被调用的函数!问题是,因为NULL是0,0是整数,所以第一个版本的func将被调用。--是的,这类事情并不总是发生,但一旦发生,就会非常令人沮丧和困惑。如果您不知道发生了什么事情的细节,它很可能看起来像一个编译器错误。一个看起来像编译器错误的语言特性不是你想要的东西。 输入nullptr。在C++11中,nullptr是一个新关键字,可以(而且应该!)用于表示空指针;换句话说,无论您以前在哪里写空,都应该使用nullptr。程序员(每个人都知道NULL意味着什么)、对编译器来说不太清楚,因为编译器将不再看到到处都使用了0作为指针具有特殊意义。
Allain在文章结尾处写道:
尽管如此-- C++11的经验法则是,在过去使用
NULL的时候,只要不使用NULL,就可以开始使用NULL。
(我的话):
最后,不要忘记nullptr是一个对象--一个类。它可以在NULL以前使用过的任何地方使用,但是如果您出于某种原因需要它的类型,可以用decltype(nullptr)提取它的类型,或者直接描述为std::nullptr_t,它只是一个typedef of decltype(nullptr),如下所示:
标头<cstddef>**:**中定义的
请参见:
namespace std
{
typedef decltype(nullptr) nullptr_t; // (since C++11)
// OR (same thing, but using the C++ keyword `using` instead of the C and C++
// keyword `typedef`):
using nullptr_t = decltype(nullptr); // (since C++11)
} // namespace std参考文献:
发布于 2009-08-15 17:02:18
来自nullptr:一个类型安全和清晰的空指针
新的C++09 nullptr关键字指定一个rvalue常量,它充当一个通用的空指针文本,替换了buggy和弱类型的文本0和臭名昭著的空宏。因此,nullptr结束了30多年来的尴尬、模糊和错误。下面的部分介绍了nullptr工具,并展示了它如何纠正NULL和0的缺陷。
其他参考资料:
https://stackoverflow.com/questions/1282295
复制相似问题