MSVC - C2668 对重载函数的模糊调用 - 它是编译器错误吗?

MSVC - C2668 ambiguous call to overloaded function - Is it a compiler bug?

MSVC 19.28 拒绝以下代码并显示错误消息:C2668 对重载函数的不明确调用 A::Foo。 这是编译器错误吗?它可以用 gcc、clang 甚至 msvc 19.10 编译得很好。 它自 MSVC 19.14 以来失败,请参阅 here

#include <iostream>

class A {
public:
    template<typename T>
    void Foo(int = {}) {
        std::cout << "Hello World";
    }

    template<typename... T, typename... Args>
    void Foo(Args&&... args) {

    }
};

int main()
{
    A a;
    a.Foo<int>();
}

对于调用 Foo<int>(),编译器可以为第一个模板推导 Foo<int>(),为第二个模板推导 Foo<int>(void)

来自temp.deduct.partial#11

... if G has a trailing function parameter pack for which F does not have a corresponding parameter, and if F does not have a trailing function parameter pack, then F is more specialized than G.

这是决胜局,选择第一个模板。

无法解决歧义似乎是 MSVC 错误。