`nullptr_t`应该是全局命名空间的一部分吗?

Mot*_*tti 4 c++ language-lawyer c++11

我看到微软的stddef.h定义nullptr_t如下:

namespace std
{
    typedef decltype(__nullptr) nullptr_t;
}

using ::std::nullptr_t;
Run Code Online (Sandbox Code Playgroud)

usingdecleration注入nullptr_t到全局命名空间.我在标准中找不到任何说明应该这样做的东西.

我也看到GCC nullptr_t不在全局命名空间中.

可以允许两种实现,还是其中一种是错误? 我的坏,GCC的行为与CL相同.


编辑:同样的情况发生cstddef,以下编译好VC(在线也).

#include <cstddef>

int main()
{
    nullptr_t nil = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

小智 7

它必须位于全局命名空间中.

D.5 C标准库头文件[depr.c.headers]

2每个C标头(每个标头都有一个表单名称)的name.h行为就好像每个由相应cname标头放置在标准库名称空间中的名称放在全局名称空间范围内.[...]

对于特定于C++的名称,此处没有例外.如果C++为<cstddef>C <stddef.h>提供的名称没有提供,那么C++ <stddef.h>仍然需要提供它.