【问题标题】:What C++0x Headers are supposed to define nullptr?哪些 C++0x 头文件应该定义 nullptr?
【发布时间】:2025-12-16 18:25:05
【问题描述】:

现在 C++0x 快到了,我一直在试验它,特别是使用 nullptr。我一直无法弄清楚如果需要使用它应该包含哪些标准头文件。

感谢任何帮助。

【问题讨论】:

  • nullptr 仅受 GCC 4.6 或更高版本或 MSVC 10 支持。可能您的编译器不够新。
  • Centos 已知有旧版本的 gcc,因此感谢您的提醒。 (仅供参考,用于 centos 的 gcc 版本:5 艘 4.1.x,6 艘 4.4.x,7 艘 4.8.x。)

标签: c++ header c++11 nullptr


【解决方案1】:

不应要求任何标题。它是一个内置关键字 (§[lex.nullptr])。

2.14.7 指针文字               [lex.nullptr]

指针字面量:
nullptr

指针字面量是关键字 nullptr。它是类型的prvalue std::nullptr_t。 [ 注意: std::nullptr_t 是一种独特的类型,既不是 指针类型也不是指向成员的指针 类型;而是这种类型的prvalue 是一个空指针常量,可以是 转换为空指针值或 空成员指针值。见 4.10 和 4.11。 —尾注]


然而,它的类型 std::nullptr_t 在标头 <cstddef> 中“定义”(§[support.types]/9)。

nullptr_t定义如下:

namespace std {
    typedef decltype(nullptr) nullptr_t;
}

nullptr_t 是同义词的类型具有 3.9.1 和 4.10 中描述的特征。 [注意:虽然nullptr的地址不能取,但是可以取另一个nullptr_t的左值对象的地址。 —尾注]

【讨论】:

  • 谢谢!我最初是这么认为的,但发现 g++ 在我的一个单元测试中已经停止接受 nullptr。我认为这是一个标题问题,但不知何故我的 g++ 版本已从 4.6(支持它)降级到 4.5(不支持)。
  • 嘿,我喜欢将 nullptr 的类型定义为“nullptr 的类型”的向后逻辑。