【问题标题】:Why is nullptr_t not a keyword为什么 nullptr_t 不是关键字
【发布时间】:2015-12-05 15:57:12
【问题描述】:

这是nullptr_t<cstddef> 中的声明:

namespace std {
  typedef decltype(nullptr) nullptr_t;
}

根据thisstd::nullptr_t 是一些未指定的基本类型的别名,其中nullptr 是一个实例。所以nullptr的实际类型没有名字(好吧,语言没有给它名字,名字是标准库给的)。

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

这样做的原因是什么?我发现它很混乱。您需要包含标题并指定 std:: 才能使用语言内置功能。

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

【问题讨论】:

  • 是的,没有什么比在语言中添加新关键字更能破坏现有代码的了。顺便说一句,enum classfinaloverride 等上下文关键字是不错的选择。
  • 但这也是最容易检测和修复的事情(当然总有病态的情况,例如代码生成)。考虑到这一点,可能有无数更糟糕的方法来破坏现有代码。
  • 添加新关键字会给现有代码带来潜在的中断,委员会尽可能避免这种中断。请参阅Why are override and final identifiers with special meaning instead of reserved keywords? 了解不进行覆盖和最终保留字的理由。

标签: c++ c++11


【解决方案1】:

根据nullptr的初步提议,N2431Emphasis Mine):

我们提出了一个新的标准保留字nullptrnullptr 关键字 指定decltype(nullptr) 类型的常量右值。我们也 提供typedef: typedef decltype(nullptr) nullptr_t; nullptr_t 是 不是保留字。 它是一个typedef(正如它的_t typedef 所示) decltype(nullptr) 定义在 <cstddef> 中。 我们预计不会看到太多 在实际程序中直接使用 nullptr_t。

一般来说,委员会不愿意在语言中添加新的关键字。在我看来,这是有充分理由的,名为向后兼容性。

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

想象一下,如果委员会不时引入一个新关键字会产生什么影响。一切都将崩溃,成功故事中的 C++ 将成为一个大笑话。

【讨论】:

  • 但是添加了 nullptr 的新关键字。我确信有人已经在他们的代码中使用nullptr 的可能性比使用nullptr_t 的可能性更高,因为“我们不希望在实际程序中看到很多直接使用 nullptr_t。”
  • 所以新类型应该被添加到std命名空间?
  • @anton_rh 他们提议将nullptr 作为关键字。 “我们提出了一个新的标准保留字 nullptr。”。这个名字是在非正式的极点和谷歌搜索后选择的。
  • @anton_rh 相信委员会,他们是明智的。他们必须考虑我们不知道的事情,并从中做出最好的妥协。
【解决方案2】:

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

由于std::nullptr_t是可定义的,所以它不需要是关键字。

bool 是出于历史原因的关键字。它很可能很早就被引入了......

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

【讨论】:

  • 我们完全可以避免使用关键字。只需使用std:: 即可。 std::int int = 10, while = 0; std::while(int > while) ...
  • 但 C++ 委员会不希望这样。 FWIW PL/1 是一种没有关键字的语言,所以IF IF=THEN THEN ELSE=IF; 在 PL/1 中有效但不可读
【解决方案3】:

在不必要时避免添加新关键字。既然可以添加到库中,为什么还要添加一些东西到语言中。

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

【讨论】:

  • 我认为size_t 只是unsigned int 的typedef 或其他对平台运行代码正确的东西。这里没有内置功能。
  • @anton - 是的,std::size_t 是一个 typedef,就像 std::nullptr_t。 :-) 并且编译器可以为sizeof 返回该类型的值,就像它可以为nullptr 返回一个值一样,即使没有任何类型定义可见。没有区别!
  • 我确信 size_t 已映射到现有的 named 类型(如 unsigned int)。那就是区别。虽然在stddef.h 中找不到它并认为它也很神奇...... O_o
  • 找到了一个很好的线程,它揭示了 std::nullptr_t 和 std::size_t 之间的类比:stackoverflow.com/a/20809166/5447906
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 2010-10-18
  • 2011-10-03
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多