编译器差异:别名解析和名称查找之间的交互
Compiler discrepancy: Interaction between alias resolution and name lookup
考虑以下代码:
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:
如果名称查找在两个不同的命名空间,并且声明不声明同一实体没有声明函数,名称的使用是格式错误的
相关文章:
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 查找字符在两个索引之间出现的次数
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 在C++中查找两个向量之间最相似的值
- 查找多个向量之间的公共元素(无整数元素)
- 查找彼此之间具有不同最小距离的随机数
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 设置::查找和查找之间的性能差异<algorithm>
- 递归函数,用于查找 2 个整数之间的最大值
- 使用特征查找两个列表之间的差异
- 在地图和列表之间查找标准容器
- CPP 程序二查找两个给定日期之间的天数,conol CMD
- 在由邻接列表表示的树中查找节点到另一个给定节点之间的路径
- 查找C++中两个索引之间的子字符串
- 查找树中两个节点之间的最大成本边
- 尝试查找数组中点之间的最小距离时的随机垃圾输出
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 编译器差异:别名解析和名称查找之间的交互
- 用于在数据结构中查找" "之间的字符串的代码