为什么 nullptr 不需要 header 而 nullptr_t 需要

roh*_*itt 9 c++ c++11

nullptr_t是 的类型nullptr。当我使用 时nullptr_t,我必须使用头文件,<cstddef>但为什么nullptr单独使用关键字时不需要它?

dfr*_*fri 5

根据[lex.key]/1nullptr是一个关键字:

表 5 中显示的标识符保留用作关键字(即,它们在阶段 7 中被无条件地视为关键字)[...]

[tab:lex.key] : ...nullptr

std::nullptr_t是标准定义的别名声明。特别是,从[cstddef.syn] 开始,被定义为 anullptr表达式的类型:

标题<cstddef>概要

...

using nullptr_t = decltype(nullptr);
Run Code Online (Sandbox Code Playgroud)

[support.types.nullptr]/1 中所述

类型nullptr_­tnullptr表达式类型的同义词,它具有 [basic.fundamental] 和[conv.ptr] 中描述的特征。

因此,要使用std::nullptr_t,您需要包含<cstddef>标头,但decltype(nullptr)如果您只是想要相同的基础类型但不使用std::nullptr_t别名,则同样可以使用。


Dan*_*ica 4

nullptr是一个关键字,std::nullptr_t是 C++ Stadnard 库定义的类型。关键字不是由头文件引入的,它们是在编译器本身中“连接”的。

  • 有趣的事实:这基本上就是 `std::nullptr_t` 的定义方式。 (3认同)