为什么 MSVC 16.7 处理涉及从 long 到 int 不明确转换的函数重载?
Why does MSVC 16.7 treat function overload involving conversion from long to int ambiguous?
我已将我的 MSVC 更新到 16.7,现在他抱怨以下代码:
error C2668: ... ambiguous call to overloaded function
void f(int){
}
void f(double){
}
int main()
{
long l = 5;
static_assert(sizeof(long)==4,"");
f(l);
}
它曾经在旧的编译器中编译
https://godbolt.org/z/PG7GTY
我明白为什么 GCC 和 Clang 会抱怨,因为它们的 long 是 8 个字节,但是当 MSVC 上的 long 是 32 位时,为什么 MSVC 会拒绝这个代码,也就是 int。
C++ 标准是否要求它是模棱两可的,或者如果它们是“相同的底层”类型,那么实现将 long 视为 int 是否适合重载解析。
如果重要的话,我正在 MSVC 上使用 C++20 标志进行编译。
首先,编译器寻找一个无需隐式转换即可调用的函数。如果它恰好找到一个,它就会调用它。
如果它找到 none,它会寻找一个可以通过一次隐式转换调用的函数。在您的示例中,两个函数都只需要一个隐式转换。这使得代码模棱两可。
类型的大小完全无关紧要。
https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions
我已将我的 MSVC 更新到 16.7,现在他抱怨以下代码:
error C2668: ... ambiguous call to overloaded function
void f(int){
}
void f(double){
}
int main()
{
long l = 5;
static_assert(sizeof(long)==4,"");
f(l);
}
它曾经在旧的编译器中编译 https://godbolt.org/z/PG7GTY
我明白为什么 GCC 和 Clang 会抱怨,因为它们的 long 是 8 个字节,但是当 MSVC 上的 long 是 32 位时,为什么 MSVC 会拒绝这个代码,也就是 int。
C++ 标准是否要求它是模棱两可的,或者如果它们是“相同的底层”类型,那么实现将 long 视为 int 是否适合重载解析。
如果重要的话,我正在 MSVC 上使用 C++20 标志进行编译。
首先,编译器寻找一个无需隐式转换即可调用的函数。如果它恰好找到一个,它就会调用它。
如果它找到 none,它会寻找一个可以通过一次隐式转换调用的函数。在您的示例中,两个函数都只需要一个隐式转换。这使得代码模棱两可。
类型的大小完全无关紧要。
https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions