【发布时间】:2015-12-05 15:57:12
【问题描述】:
这是nullptr_t 在<cstddef> 中的声明:
namespace std {
typedef decltype(nullptr) nullptr_t;
}
根据this,std::nullptr_t 是一些未指定的基本类型的别名,其中nullptr 是一个实例。所以nullptr的实际类型没有名字(好吧,语言没有给它名字,名字是标准库给的)。
nullptr 本身就是一个关键字。但是标准没有为nullptr 类型引入关键字。而是使用decltype(nullptr)。
这样做的原因是什么?我发现它很混乱。您需要包含标题并指定 std:: 才能使用语言内置功能。
这是为了使 C++ 关键字集尽可能小吗?这是专门针对nullptr 还是委员会将声明所有这样的新类型,所以如果早点做出这样的决定,我们会有namespace std { typedef decltype(false) bool; }?
【问题讨论】:
-
是的,没有什么比在语言中添加新关键字更能破坏现有代码的了。顺便说一句,
enum class、final、override等上下文关键字是不错的选择。 -
但这也是最容易检测和修复的事情(当然总有病态的情况,例如代码生成)。考虑到这一点,可能有无数更糟糕的方法来破坏现有代码。
-
添加新关键字会给现有代码带来潜在的中断,委员会尽可能避免这种中断。请参阅Why are override and final identifiers with special meaning instead of reserved keywords? 了解不进行覆盖和最终保留字的理由。