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