C++ “nullptr\t”是否应该是全局命名空间的一部分?

C++ “nullptr\t”是否应该是全局命名空间的一部分?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,我看到微软的stddef.h这样定义了nullptr\t: namespace std { typedef decltype(__nullptr) nullptr_t; } using ::std::nullptr_t; 使用declaration的将nullptr\t注入全局命名空间。我在标准中找不到任何规定应该这样做的东西 我还看到,在GCCnullptr\u t中,它不在全局名称空间中 这两种实现都是允许的,还是其中一种是bug? 我的坏消息是,GCC的行为与CL相同 编辑:

我看到微软的
stddef.h
这样定义了
nullptr\t

namespace std
{
    typedef decltype(__nullptr) nullptr_t;
}

using ::std::nullptr_t;
使用declaration的
nullptr\t
注入全局命名空间。我在标准中找不到任何规定应该这样做的东西

我还看到,在GCC
nullptr\u t
中,它不在全局名称空间中

这两种实现都是允许的,还是其中一种是bug? 我的坏消息是,GCC的行为与CL相同


编辑:同样的情况也发生在
cstdef
中,下面的代码可以通过VC()编译

#包括
int main()
{
nullptr_t nil=nullptr;
}

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

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

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

<>这里没有任何针对C++的名称的例外。如果C++添加了一个名称,该代码是C的<代码> <代码>不提供的,那么C++的<>代码> /COD>还需要提供它。 我还看到,在GCC中,nullptr\t不在全局名称空间中

你确定吗

您可能有一个较旧版本的GCC,我在GCC4.8.0及更高版本中看到了它

cstddef也是如此


这并不能保证有效。要便携式使用
::nullptr\u t
,必须包括
。要可移植地使用
std::nullptr\t
,您必须包括

使用::std::nullptr\t之间是否存在差异
使用std::nullptr\t?顺便说一句,问得好。@gsamaras我不认为有什么区别。在这种情况下没有区别。如果你有
名称空间foo{namespace std{using nullptr\u t=int}使用std::nullptr\u t;}
,这是有区别的。GCC确实在全局名称空间中定义了它:@JonathanWakely,oops,你是对的。它也被注入到全局名称空间中,
@Motti是的,这是允许的。
标题必须在
std
命名空间中定义名称,也可以在全局命名空间中定义名称。
标题必须在全局命名空间中定义它们,也可以在
std
命名空间中定义它们。
#include <cstddef>

int main()
{
    nullptr_t nil = nullptr;
}