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

yoh*_*hjp 7 c++ namespaces

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

一个不愿透露姓名的命名空间定义的行为就好像它被取代

namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
Run Code Online (Sandbox Code Playgroud)

为什么不简单地遵循定义?

namespace unique { namespace-body }
using namespace unique;
Run Code Online (Sandbox Code Playgroud)

附带问题:MSDN按后一种形式定义.它在技术上是否违反了标准?

Joh*_*itb 7

你不能再这样做了

namespace { typedef int a; ::a x; }
Run Code Online (Sandbox Code Playgroud)

请注意,在随后的中namespace { ... },突然间你可以.这将是非常不一致的.

还要注意这种情况,有两种不同的有效结果

namespace A { void f(long); }
using namespace A;

namespace { 
  void f(int);
  void g() {
    ::f(0);
  }
}
Run Code Online (Sandbox Code Playgroud)

使用ISO C++,这将调用int版本f.使用您的替代定义,它会调用该long版本.

  • 我花了一些时间才从你的答案中弄清楚你的意思是我所表达的,"标准中的定义确保在命名空间体中声明的名称可以通过完全限定在名称空间体中引用他们使用全局命名空间.例如......" (3认同)