内联命名空间和不明确的声明

Inline namespaces and ambigous declarations

本文关键字:声明 不明确 命名空间      更新时间:2023-10-16

我想知道这是否被允许:

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-指令引入,即使有声明 封闭命名空间中的该名称。

但我不明白。

看起来这是一个 pre clang 3.5 错误,并且有两个关于此 812 和 861 的缺陷报告。分辨率在 861 中,并在 [namespace.qual] 3.4.3.2中添加以下内容(强调我的(:

对于命名空间 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,由 X 中的 using 指令及其内联命名空间集指定。

以及相关的补充:

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

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