编译器差异:别名解析和名称查找之间的交互

时间:2016-03-24 15:53:17

标签: c++ c++11 language-lawyer typedef name-lookup

考虑以下代码:

using type = long;

namespace n {
  using type = long;
}

using namespace n;
int main() {
  type t;
}

这会在Clang 3.7GCC 5.3上干净地编译,但MSVC 19 *会出现以下错误消息:

main.cpp(9): error C2872: 'type': ambiguous symbol
main.cpp(1): note: could be 'long type'
main.cpp(4): note: or       'n::type'

这段代码是否格式正确?该标准的哪一部分指出在模糊检查之前是否解决了别名?

请注意,如果更改其中一个别名,Clang和GCC都会向MSVC提供类似的错误。

我完全清楚这个名字的排位性如何解决这种模糊性,我只是对标准对此有何看法感兴趣。

* - 只需粘贴代码并在该链接上运行,我不知道是否有永久链接的在线MSVC编译器

2 个答案:

答案 0 :(得分:4)

[namespace.udir]/6

  

如果名称查找在两个不同的名称空间中找到名称的声明,并且声明不声明相同的实体并且不声明函数,则名称的使用是错误的。< / p>

但是,这些确实声明名称引用相同的类型,因此程序应该是格式良好的。这种解释是例如core issue 1894中的评论确认:

  //[..]

  namespace C {
    // The typedef does not redefine the name S in this
    // scope, so issue 407's resolution does not apply.
    typedef A::S S;
    using A::S;
    // **The name lookup here isn't ambiguous, because it only finds one
    // entity**, but it finds both a typedef-name and a non-typedef-name referring
    // to that entity, so the standard doesn't appear to say whether this is valid.
    struct S s;
  }

答案 1 :(得分:-1)

7.3.4 / 6:

  

如果名称查找找到两个不同的名称声明   名称空间,并且声明不会声明相同的实体   不声明功能,名称的使用是不正确的