为什么nullptr_t不是关键字

时间:2015-12-05 15:57:13

标签: c++ c++11

以下是nullptr_t<cstddef>的声明:

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

根据thisstd::nullptr_t是某些未指定基本类型的别名,nullptr是一个实例。因此nullptr的实际类型没有名称(嗯,语言没有给它起名称,名称由标准库提供)。

nullptr本身就是一个关键字。但标准没有为nullptr类型引入关键字。而是使用decltype(nullptr)

这样做的原因是什么?我觉得很困惑。您需要包含标题并指定std::才能使用语言内置功能。<​​/ p>

这是为了让C ++关键字集尽可能小吗?这是专门针对nullptr或委员会是否会声明所有类似的新类型,所以如果早些时候做出这样的决定,我们会namespace std { typedef decltype(false) bool; }吗?

3 个答案:

答案 0 :(得分:9)

根据nullptr的初步提案,N2431强调我的):

  

我们提出了一个新的标准保留字nullptrnullptr个关键字   指定decltype(nullptr)类型的常量右值。我们也   提供typedeftypedef decltype(nullptr) nullptr_t; nullptr_t是   不是保留字。这是typedef(因为_t typedef表示)   decltype(nullptr)中定义了<cstddef>我们不希望看到太多   在真实程序中直接使用nullptr_t。

一般来说,委员会不愿意在该语言中添加新的关键词。我的拙见认为这是一个很好的理由,名为向后兼容性。

如果您进一步阅读该提案,您就会意识到主要问题不在于破坏现有代码。

想象一下,如果委员会现在然后引入一个新的关键词会产生什么影响。所有的地狱都会破裂,C ++从成功的故事开始就是一个大笑话。

答案 1 :(得分:3)

我认为原因很简单:标准化委员会希望尽可能避免引入新的关键字(因为,鉴于数十亿行现有的 C ++代码,它可能会与一些代码。)

由于std::nullptr_t可以定义,因此不需要是关键字。

bool因历史原因而成为关键字。它很可能很早就推出了......

C ++主要是关于遗留软件,因此人类,社会和经济方面的考虑(以及向后兼容性)对标准化委员会来说很重要(通常仅仅是技术原因)。

答案 2 :(得分:3)

在不需要时,可以避免添加新关键字。为什么在可以添加到库中时添加一些语言。

你已经有sizeof(x)类似的东西返回std::size_t,你还需要包含一个标题来获取typedef。