nullptr_t是 的类型nullptr。当我使用 时nullptr_t,我必须使用头文件,<cstddef>但为什么nullptr单独使用关键字时不需要它?
根据[lex.key]/1,nullptr是一个关键字:
表 5 中显示的标识符保留用作关键字(即,它们在阶段 7 中被无条件地视为关键字)[...]
[tab:lex.key] : ...
nullptr
而std::nullptr_t是标准定义的别名声明。特别是,从[cstddef.syn] 开始,被定义为 anullptr表达式的类型:
标题
<cstddef>概要...
Run Code Online (Sandbox Code Playgroud)using nullptr_t = decltype(nullptr);
如[support.types.nullptr]/1 中所述:
类型
nullptr_t是nullptr表达式类型的同义词,它具有 [basic.fundamental] 和[conv.ptr] 中描述的特征。
因此,要使用std::nullptr_t,您需要包含<cstddef>标头,但decltype(nullptr)如果您只是想要相同的基础类型但不使用std::nullptr_t别名,则同样可以使用。
nullptr是一个关键字,std::nullptr_t是 C++ Stadnard 库定义的类型。关键字不是由头文件引入的,它们是在编译器本身中“连接”的。