为什么nullptr_t不是关键字

Why is nullptr_t not a keyword

本文关键字:关键字 nullptr 为什么      更新时间:2023-10-16

这是<cstddef>nullptr_t的声明:

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(强调我的(:

我们提出了一种新的标准保留字nullptrnullptr关键字 指定类型 decltype(nullptr) 的常量右值。我们也 提供typedeftypedef 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。