内联命名空间和不明确的声明

Bik*_*eev 3 c++ namespaces language-lawyer c++11

我想知道是否允许这样做:

namespace A {
  inline namespace B {
    int a;
  }
  int a;
}

void foo() {
  A::a = 0; // clang 3.4 compiles, but gcc doesn't
}
Run Code Online (Sandbox Code Playgroud)

标准说,那

最后,通过显式限定(3.4.3.2)查找封闭命名空间中的名称将包括using-directive引入的内联命名空间的成员,即使在封闭命名空间中存在该名称的声明也是如此.

但我无法得到它.

Sha*_*our 5

看起来这是一个pre clang 3.5 bug,并且在812861上有两个缺陷报告.分辨率在861,并将以下内容添加到3.4.3.2 [namespace.qual](强调我的前进):

对于名称空间X和名称m,名称空间限定的查找集S(X,m)定义如下:设S'(X,m)是X中所有m的声明集和X的内联名称空间集(7.3.1 [namespace.def]).如果S'(X,m)不为空,则S(X,m)为S'(X,m); 否则,S(X,m)是由X中的using指令及其内联命名空间集指定的所有非内联名称空间的S(Ni,m)的并集.

以及相关的补充:

如果S(X,m)是空集,则程序格式不正确.否则,如果S(X,m)只有一个成员,或者引用的上下文是using-declaration(7.3.3 [namespace.udecl]),则S(X,m)是必需的声明集米 否则,如果m的使用不是允许从S(X,m)中选择唯一声明的那个,则该程序是不正确的.

看起来这个更改是在C++ 11之前添加的,这个文本出现在N3337中.