为什么 MSVC 16.7 处理涉及从 long 到 int 转换的函数重载不明确?

NoS*_*tAl 2 c++ type-conversion language-lawyer c++20

我已将 MSVC 更新到 16.7,现在他抱怨以下代码:

错误 C2668:... 对重载函数的调用不明确

void f(int){
}

void f(double){
}

int main()
{   
    long l = 5;
    static_assert(sizeof(long)==4,"");
    f(l);
}
Run Code Online (Sandbox Code Playgroud)

它曾经在较旧的编译器中编译 https://godbolt.org/z/PG7GTY

我理解为什么 GCC 和 Clang 会抱怨,因为它们的 long 是 8 个字节,但是当 MSVC 上的 long 是 32 位时,为什么 MSVC 会拒绝此代码,也就是与 int 相同。

C++ 标准是否要求这是模棱两可的,或者如果它们是“相同的基础”类型,那么为了重载解析的目的,实现是否可以考虑 long 作为 int 。

如果重要的话,我正在 MSVC 上使用 C++20 标志进行编译。

Tho*_*lik 7

首先,编译器查找无需隐式转换即可调用的函数。如果它恰好找到一个,它就会调用它。

如果没有找到,它会寻找一个可以通过一次隐式转换调用的函数。在您的示例中,两个函数都需要一个隐式转换。这使得代码模棱两可。

类型的大小绝对无关紧要。

https://en.cppreference.com/w/cpp/language/overload_resolution#Viable_functions