以下是nullptr_t
中<cstddef>
的声明:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
根据this,std::nullptr_t
是某些未指定基本类型的别名,nullptr
是一个实例。因此nullptr
的实际类型没有名称(嗯,语言没有给它起名称,名称由标准库提供)。
nullptr
本身就是一个关键字。但标准没有为nullptr
类型引入关键字。而是使用decltype(nullptr)
。
这样做的原因是什么?我觉得很困惑。您需要包含标题并指定std::
才能使用语言内置功能。</ p>
这是为了让C ++关键字集尽可能小吗?这是专门针对nullptr
或委员会是否会声明所有类似的新类型,所以如果早些时候做出这样的决定,我们会namespace std { typedef decltype(false) bool; }
吗?
答案 0 :(得分:9)
根据nullptr
的初步提案,N2431(强调我的):
我们提出了一个新的标准保留字
nullptr
。nullptr
个关键字 指定decltype(nullptr)
类型的常量右值。我们也 提供typedef
:typedef 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。