std::nullptr_t 在 std 命名空间中的位置和原因是什么?

Twi*_*ard 1 c++ language-lawyer

首先,std::nullptr_t是核心语言类型,那么为什么它在std命名空间中呢?你没有看到std::charstd::int

其次,它在std命名空间中的什么位置?当我在 Visual Studio 中右键单击以查看其声明位置时,它显示“符号 nullptr_t 未位于任何源文件中”。如果std::nullptr_t没有在std命名空间中声明,为什么包含的代码std::nullptr_t编译?

编辑: 微软网站上的链接说 nullptr 是内置类型,并且内置类型未在头文件中定义。

use*_*570 5

\n

std::nullptr_t 是核心语言类型

\n
\n

std::nullptr_t是一个基本类型(又名内置类型),如此处所述。尽管它可以隐式转换为任何指针类型,但它甚至不是指针类型。此外,它是cstddef在 namepsace 的标头内定义的std标头内部定义的,如下引用。

\n

这可以从lex.nullptr看出

\n
\n

指针字面量是关键字nullptr。它是类型 的纯右值std\xe2\x80\x8b::\xe2\x80\x8bnullptr_\xc2\xadt。\n[\xc2\xa0注意:std\xe2\x80\x8b::\xe2\x80\x8bnullptr_\xc2\xadt是一种不同的类型,既不是指针类型也不是指向成员的指针类型;相反,这种类型的纯右值是空指针常量,可以转换为空指针值或空成员指针值。\n请参阅 [conv.ptr] 和 [conv.mem]。\n\xe2\x80\x94\ xc2\xa0结束注释\n\xc2\xa0]

\n
\n

来自cstddef.syn

\n
\n

标题<cstddef>概要

\n
namespace std {\n using nullptr_\xc2\xadt = decltype(nullptr);\n\n //other things here\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n