【问题标题】:Inline namespaces and ambigous declarations内联命名空间和模棱两可的声明
【发布时间】:2015-01-30 21:06:24
【问题描述】:

我想知道这是否允许:

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

但我无法得到它。

【问题讨论】:

  • gcc 4.9clang 3.5 都不允许此代码,您可以尝试 wandbox ... clang 3.4 确实如此,似乎是一个错误
  • @ShafikYaghmour 谢谢你,Shafik。这是很棒的资源。是的,我在工作中尝试过这段代码,这里有 clang-3.4

标签: c++ c++11 namespaces language-lawyer


【解决方案1】:

看起来这是一个pre clang 3.5 bug,并且有两个关于此812861 的缺陷报告。决议在 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) 的并集,用于 X 中的 using 指令指定的所有非内联命名空间 Ni 及其内联命名空间集。

以及相关的补充:

如果 S(X,m) 是空集,则程序是非良构的。否则,如果 S(X,m) 恰好有一个成员,或者如果引用的上下文是使用声明 (7.3.3 [namespace.udecl]),则 S(X,m) 是所需的声明集米。 否则,如果 m 的使用不允许从 S(X,m) 中选择唯一声明,则程序是非良构的。

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

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 2013-08-10
    • 2011-03-13
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多