首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器差异:别名解析和名称查找之间的交互

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

Stack Overflow用户
提问于 2016-03-24 15:53:17
回答 2查看 188关注 0票数 9

请考虑以下代码:

代码语言:javascript
运行
复制
using type = long;

namespace n {
  using type = long;
}

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

这可以在Clang 3.7GCC 5.3上清晰地编译,但是MSVC 19*提供了以下错误消息:

代码语言:javascript
运行
复制
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提供类似的错误。

我完全知道如何限定名称将解决歧义,我只是感兴趣的标准必须说这一点。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-24 16:01:32

[namespace.udir]/6

如果名称查找在两个不同的名称空间中找到名称的声明,而声明不声明相同的实体且不声明函数,则名称的使用格式不正确。

但是,它们确实声明名称引用相同的类型,因此程序应该是格式良好的。例如,核心问题1894中的评论证实了这种解释

代码语言:javascript
运行
复制
  //[..]

  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;
  }
票数 4
EN

Stack Overflow用户

发布于 2016-03-24 16:03:06

7.3.4 / 6:

如果名称查找在两个不同的名称空间中找到名称的声明,且声明不声明相同的实体,也不声明函数,则名称的使用格式不正确。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36204506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档