内联名称空间和模糊声明

时间:2014-12-02 15:02:14

标签: c++ c++11 namespaces language-lawyer

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

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

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

标准说,

  

最后,通过显式查找封闭命名空间中的名称   资格(3.4.3.2)将包括内联命名空间的成员   即使有声明,也会被使用指令引入   该名称在封闭的命名空间中。

但我无法得到它。

1 个答案:

答案 0 :(得分: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中。