我想知道这是否被允许:
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)在封闭名称空间中查找名称,将包含由are指令引入的内联名称空间的成员,即使在封闭名称空间中有该名称的声明。
但我搞不懂。
发布于 2014-12-02 15:16:03
看起来这是一个pre clang 3.5虫,在这个八一二和八六一上有两个缺陷报告。该决议是在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中的指令及其内联命名空间集命名的所有非内联命名空间Ni的S(X,m)的并。
以及其他相关补充:
如果S(X,m)是空集,则程序不正确.否则,如果S(X,m)正好有一个成员,或者如果引用的上下文是使用-声明(7.3.3 namespace.udecl),则S(X,m)是m. 的所需的声明集,否则如果m的使用不是允许从S(X,m)中选择唯一的声明,则程序是错误的。
看起来更改是在C++11前添加的,这段文字是在N3337中出现的。
https://stackoverflow.com/questions/27252466
复制相似问题