这是一个声明 nullptr_t
在 <cstddef>
:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
根据 这个, std::nullptr_t
是某些未指定的基本类型的别名 nullptr
是一个实例。所以实际的类型 nullptr
没有名字(好吧,语言没有给它起名字,名称由标准库提供)。
nullptr
本身就是一个关键字。但标准没有为类型引入关键字 nullptr
。而是使用 decltype(nullptr)
提供。
这样做的原因是什么?我觉得很困惑。您需要包含标头并指定 std::
仅使用语言内置功能。
这是为了保持C ++关键字的集合尽可能小吗?这是专门为 nullptr
或委员会将宣布所有类似的新类型,所以我们会 namespace std { typedef decltype(false) bool; }
如果早点作出这样的决定?
根据最初的提议 nullptr
, N2431 (重点是我的):
我们提出一个新的标准保留字 nullptr
。该 nullptr
关键词
指定一个恒定的rvalue类型 decltype(nullptr)
。我们也
提供 typedef
: typedef decltype(nullptr) nullptr_t;
nullptr_t
是
不是保留字。 它是一个 typedef
(就像它一样 _t
typedef
表示)
decltype(nullptr)
定义于 <cstddef>
。 我们不希望看到太多
在真实程序中直接使用nullptr_t。
一般来说,委员会不愿意在语言中添加新的关键词。在我的拙见中,这是有充分理由的 向后兼容。
如果您进一步阅读该提案,您会发现主要问题不在于破坏现有代码。
想象一下,如果委员会现在然后引入一个新的关键词会产生什么影响。所有的地狱都会破裂,而C ++从成功故事中解脱出来会是个大笑话。
我相信原因很简单:标准化委员会希望尽可能避免引入新的关键词(因为,鉴于数十亿行 现有 C ++代码,它可能与某些代码冲突)。
以来 std::nullptr_t
可以定义,它不需要是关键字。
和 bool
是历史原因的关键字。很可能很早就推出了......
C ++主要是关于遗留软件,因此人类和社会和经济方面的考虑(以及向后兼容性)对标准化委员会来说很重要(通常仅仅是技术原因)。
在不需要时,可以避免添加新关键字。为什么在可以添加到库中时添加某些语言。
你已经有了类似的事情 sizeof(x)
返回 std::size_t
,你还必须包含一个标头来获取typedef。