编译器差异:别名解析和名称查找之间的交互
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 and GCC 5.3, but 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 类似的错误。
我完全知道限定名称将如何解决歧义,我只是对标准对此有何评论感兴趣。
*- 粘贴代码然后运行到link,我不知道是否有带有permalinks
的在线MSVC编译器
If name lookup finds a declaration for a name in two different namespaces, and the declarations do not declare the same entity and do not declare functions, the use of the name is ill-formed.
但是,它们确实声明了引用相同类型的名称,因此程序应该是合式的。这种解释是例如由 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;
}
7.3.4 / 6:
If name lookup finds a declaration for a name in two different
namespaces, and the declarations do not declare the same entity and do
not declare functions, the use of the name is ill-formed
考虑这段代码:
using type = long;
namespace n {
using type = long;
}
using namespace n;
int main() {
type t;
}
这在 Clang 3.7 and GCC 5.3, but 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 类似的错误。
我完全知道限定名称将如何解决歧义,我只是对标准对此有何评论感兴趣。
*- 粘贴代码然后运行到link,我不知道是否有带有permalinks
的在线MSVC编译器If name lookup finds a declaration for a name in two different namespaces, and the declarations do not declare the same entity and do not declare functions, the use of the name is ill-formed.
但是,它们确实声明了引用相同类型的名称,因此程序应该是合式的。这种解释是例如由 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;
}
7.3.4 / 6:
If name lookup finds a declaration for a name in two different namespaces, and the declarations do not declare the same entity and do not declare functions, the use of the name is ill-formed