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
注入全局命名空间。我在标准中找不到任何规定应该这样做的东西
我还看到,在GCCnullptr\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;
}