首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nullptr到底是什么?

nullptr到底是什么?
EN

Stack Overflow用户
提问于 2009-08-15 16:47:32
回答 14查看 373.9K关注 0票数 644

我们现在有了许多新特性的C++11。一个有趣和令人困惑的(至少对我来说)是新的nullptr

嗯,不再需要讨厌的宏NULL了。

代码语言:javascript
复制
int* x = nullptr;
myclass* obj = nullptr;

尽管如此,我还是不明白nullptr是如何工作的。例如,维基百科文章说:

C++11通过引入一个新的关键字来纠正这一点,作为一个可分辨的空指针常量: nullptr。它是类型的nullptr_t,它是隐式可转换的,可与任何指针类型或指针到成员类型相比较。它不是隐式可转换的或可与积分类型相比较的,但bool除外。

它如何成为关键字和类型的实例?

另外,你还有另外一个例子(维基百科的例子),nullptr比好的老0要好吗?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-08-15 17:06:52

它如何成为关键字和类型的实例?

这并不奇怪。truefalse都是关键字,作为文本,它们都有一个类型( bool )。nullptrstd::nullptr_t类型的指针文本,它是一个prvalue (您不能使用&获取它的地址)。

  • 关于指针转换的4.10表示,std::nullptr_t类型的prvalue是一个空指针常量,并且可以将一个完整的空指针常量转换为std::nullptr_t。相反的方向是不允许的。这允许重载指针和整数的函数,并通过nullptr选择指针版本。传递NULL0会令人困惑地选择int版本。
  • nullptr_t转换为整体类型需要一个reinterpret_cast,其语义与将(void*)0转换为整体类型(映射实现定义)具有相同的语义。reinterpret_cast不能将nullptr_t转换为任何指针类型。如果可能的话,依赖于隐式转换或使用static_cast
  • 标准要求sizeof(nullptr_t)sizeof(void*)
票数 439
EN

Stack Overflow用户

发布于 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>**:**中定义的

请参见:

  1. T
  2. https://en.cppreference.com/w/cpp/header/cstddef
代码语言:javascript
复制
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

参考文献:

  1. Cprogramming.com: C++11 - nullptr、enum类(强类型枚举)和cstdint中的更好类型
  2. https://en.cppreference.com/w/cpp/language/decltype
  3. T
  4. https://en.cppreference.com/w/cpp/header/cstddef
  5. https://en.cppreference.com/w/cpp/keyword/using
  6. https://en.cppreference.com/w/cpp/keyword/typedef
票数 101
EN

Stack Overflow用户

发布于 2009-08-15 17:02:18

来自nullptr:一个类型安全和清晰的空指针

新的C++09 nullptr关键字指定一个rvalue常量,它充当一个通用的空指针文本,替换了buggy和弱类型的文本0和臭名昭著的空宏。因此,nullptr结束了30多年来的尴尬、模糊和错误。下面的部分介绍了nullptr工具,并展示了它如何纠正NULL和0的缺陷。

其他参考资料:

票数 64
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1282295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档