我想知道是否允许这样做:
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)将包括内联命名空间的成员 即使有声明,也会被使用指令引入 该名称在封闭的命名空间中。
但我无法得到它。
答案 0 :(得分:5)
看起来这是pre clang 3.5 bug,此812和861有两个缺陷报告。该分辨率为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中。