以下是声明nullptr_t中<cstddef>:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
Run Code Online (Sandbox Code Playgroud)
根据这个,std::nullptr_t是一个未指定的基本类型的别名nullptr是一个实例.所以实际的类型nullptr没有名称(好吧,语言不给它起名,名称由标准库给出).
nullptr本身就是一个关键字.但标准没有为类型引入关键字nullptr.而是使用decltype(nullptr)提供.
这样做的原因是什么?我觉得很困惑.您需要包含标头并指定std::仅使用语言内置功能.
这是为了保持C++关键字的集合尽可能小吗?这是专门为nullptr委员会或委员会宣布这样的所有新类型,所以namespace std { typedef decltype(false) bool; }如果早些时候作出这样的决定我们会有吗?
根据初步方案nullptr,N2431(重点煤矿):
我们提出了一个新的标准保留字
nullptr.所述nullptr关键字指定类型的恒定右值decltype(nullptr).我们还提供typedef:typedef decltype(nullptr) nullptr_t;nullptr_t不是保留字.它是typedef(如其_ttypedef所示)decltype(nullptr)定义的<cstddef>.我们不希望看到在实际程序中直接使用nullptr_t.
一般来说,委员会不愿意在语言中添加新的关键词.我谦虚地认为这是一个很好的理由,称为向后兼容性.
如果您进一步阅读该提案,您会发现主要问题不在于破坏现有代码.
想象一下,如果委员会现在然后引入一个新的关键字,会产生什么影响.所有的地狱都会破裂,C++从成功的故事开始就是一个大笑话.