我看到微软的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;
}
答案 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>
。