为什么nullptr_t不是关键字
Why is nullptr_t not a keyword
这是<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(强调我的(:
我们提出了一种新的标准保留字
nullptr
。nullptr
关键字 指定类型decltype(nullptr)
的常量右值。我们也 提供typedef
:typedef 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。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 谷歌模拟和覆盖关键字
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++生成器 nullptr 关键字"Undefined"
- nullptr 不是一个特殊的关键字和 std::nullptr_t 的对象吗?