C++ 内联名称空间和歧义声明

C++ 内联名称空间和歧义声明,c++,c++11,namespaces,language-lawyer,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)将包括内联命名空间的成员 由using指令引入,即使有 该名称位于封闭的命名空间中 但是我不能得到它。看起来这是一个,并且在这个和上有两个

我想知道这是否允许:

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)将包括内联命名空间的成员 由using指令引入,即使有 该名称位于封闭的命名空间中

但是我不能得到它。

看起来这是一个,并且在这个和上有两个缺陷报告。解决方案在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)是S(Ni,m)的并集,用于所有非内联名称空间Ni,Ni是通过使用X及其内联名称空间集中的指令指定的

以及相关的补充内容:

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


看起来更改是在C++11之前添加的,此文本出现在中。

无论是
GCC4.9
还是
clang 3.5
都不允许使用此代码,您可以尝试<代码>铿锵3.4确实如此,但看起来像是一个bug@ShafikYaghmour谢谢你,沙菲克。这是极好的资源。是的,我在我的工作中试过这个代码,这里我有clang-3.4