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

时间:2012-03-08 18:31:35

标签: c++ namespaces

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

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

namespace {
  int foo;
}

void something()
{
  foo = 4;
}

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

2 个答案:

答案 0 :(得分:7)

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

namespace unique_per_TU
{
    // Stuff
}
using namespace unique_per_TU;

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

编辑:

您似乎已在7.3.1.1/1

中找到了它
  

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

替换一样
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespacebody }
  

所有出现的独特之处   翻译单元由相同的标识符替换   标识符与整个程序中的所有其他标识符不同。

“假”使用已经将命名空间成员带入了您发现的全局命名空间。

答案 1 :(得分:3)

除了在7.3.1.1/1中定义未命名命名空间的标准引用外,

中的一个例子中明确说明了这一点

3.3.5 / 1命名空间范围:

  

namespace-definition 的声明区域是 namespace-body original-namespace-name 表示的潜在范围是由同一声明区域中的每个名称空间定义建立的声明性区域与该的串联。原始名称空间名称的。在 namespace-body 中声明的实体被称为命名空间的成员,并且这些声明引入命名空间的声明性区域的名称被称为命名空间的成员名称。名称空间成员名称具有名称空间范围它的潜在范围包括从名称的声明(3.3.1)开始的命名空间;并为每个指定成员名称空间的 using-directive (7.3.4),   该成员的潜在范围包括 using-directive 的潜在范围的一部分,该部分位于成员的声明点之后。

>[Example:
namespace N {
      int i;
      int g(int a) { return a; }
      int j();
      void q();
}
namespace { int l=1; }
// the potential scope of l is from its point of declaration
// to the end of the translation unit

namespace N {
    int g(char a) // overloadsN::g(int)
    {
        return l+a; // l is from unnamed namespace
    }
    int i; // error: duplicate definition
    int j(); // OK: duplicate function declaration
    int j() // OK: definition ofN::j()
    {
       return g(i); // callsN::g(int)
    }
    int q(); // error: different return type
}
  

-end example]

注意措辞:
l的潜在范围是从声明点到翻译单元结束