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

时间:2015-10-13 11:17:43

标签: c++ c++11 language-lawyer

我看到微软的stddef.h定义nullptr_t因此:

namespace std
{
    typedef decltype(__nullptr) nullptr_t;
}

using ::std::nullptr_t;

using decleration nullptr_t注入全局命名空间。我在标准中找不到任何可以做到的事情。

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

可以允许两种实现,还是其中一种是bug? 我的不好,GCC的行为与CL 相同。

编辑: cstddef也是如此,以下编译好VC(online too)。

#include <cstddef>

int main()
{
    nullptr_t nil = nullptr;
}

2 个答案:

答案 0 :(得分:7)

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

  

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

     

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

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

答案 1 :(得分:2)

  

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

你确定吗?

https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/ginclude/stddef.h;hb=HEAD#l436

你可能有一个旧版本的GCC,我在GCC 4.8.0及更高版本中看到它。

  

cstddef也是如此,

这不能保证有效。要便携式使用::nullptr_t,您必须包含<stddef.h>。要便携式使用std::nullptr_t,您必须包含<cstddef>