C++未命名(匿名)命名空间的定义

7

C++03 标准 7.3.1.1 [namespace.unnamed] 第1段:(C++11 标准也使用类似的定义)

An unnamed-namespace-definition behaves as if it were replaced by

namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
为什么不简单地遵循定义?
namespace unique { namespace-body }
using namespace unique;

旁边的问题:MSDN 定义为后一种形式。从技术上讲,它是否违反了标准?


1
我认为这是因为在 namespace-body 中,你可以无需额外限定符就能访问实体,而这需要已经生效的 using namespace unique - Matthieu M.
3
在命名空间的范围内,您始终可以无需使用限定符引用该命名空间中定义的内容。 - Johannes Schaub - litb
@JohannesSchaub-litb:我知道,但我在想它与周围环境冲突的影响。 - Matthieu M.
1个回答

7

你不能再这样做了

namespace { typedef int a; ::a x; }

请注意,在后续的namespace { ... }中,你可能会突然出现这种情况。这将是极其不一致的。
还要注意这种情况,有两个不同的有效结果。
namespace A { void f(long); }
using namespace A;

namespace { 
  void f(int);
  void g() {
    ::f(0);
  }
}

使用ISO C++,这会调用fint版本。但是你的替代定义会调用long版本。


3
我花了一些时间才从你的回答中明白你的意思,也就是说,我会表达为“标准中的定义确保在命名空间体中声明的名称可以通过使用全局命名空间来完全限定它们在命名空间体中被引用。例如…” - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接