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

Compiler discrepancy: Interaction between alias resolution and name lookup

本文关键字:查找 之间 交互 别名 编译器      更新时间:2023-10-16

考虑以下代码:

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

这在Clang 3.7和GCC 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编译器

[namespace.udir]/6:

如果名称查找在两个不同的命名空间中找到一个名称的声明,并且声明没有声明同一实体并且没有声明函数,则名称的使用是错误的。

然而,它们确实声明了引用相同类型的名称,因此程序的格式应该很好。例如,核心问题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;
  }

7.3.4/6:

如果名称查找在两个不同的命名空间,并且声明不声明同一实体没有声明函数,名称的使用是格式错误的