未命名的命名空间访问规则

voi*_*ter 6 c++ namespaces

我正在查看C++ 03标准中的第7.3.1.1节,期望找到对未命名的命名空间中定义的项的访问规则的一些描述.

对于未命名的命名空间,规则似乎略有不同,因为您无法完全限定对一个项目的访问权限.我知道至少在同一个翻译单元中,可以访问未命名的命名空间中的项目,就好像它们不在命名空间中一样.例如:

namespace {
  int foo;
}

void something()
{
  foo = 4;
}
Run Code Online (Sandbox Code Playgroud)

如果命名空间有名称,则无法执行此操作.那么,标准中为这些适用于未命名命名空间的例外规则定义的规则在哪里?

Mar*_*k B 7

匿名命名空间基本上被视为:

namespace unique_per_TU
{
    // Stuff
}
using namespace unique_per_TU;
Run Code Online (Sandbox Code Playgroud)

我会在一分钟内尝试找到这里的参考.

编辑:

看来你已经找到它了 7.3.1.1/1

未命名的命名空间定义的行为就像被替换为

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

其中翻译单元中所有唯一的出现都被相同的标识符替换,并且该标识符与整个程序中的所有其他标识符不同.

正如您所发现的那样,"假"使用已经将命名空间成员带入全局命名空间.

  • 每个文件的唯一性并不完全正确。每个翻译单元都是唯一的。 (2认同)