C++ MSVC-C2668对重载函数的不明确调用-是编译器错误吗?

C++ MSVC-C2668对重载函数的不明确调用-是编译器错误吗?,c++,visual-studio,visual-c++,cl,C++,Visual Studio,Visual C++,Cl,MSVC 19.28拒绝以下代码并显示错误消息:C2668对重载函数的不明确调用A::Foo。 这是一个编译器错误吗?它可以用gcc、clang甚至msvc 19.10编译。 它自MSVC 19.14以来失败,请参阅 #包括 甲级{ 公众: 模板 void Foo(int={}){ std::cout对于调用Foo()编译器可以为第一个模板推断Foo(),为第二个模板推断Foo(void) 发件人: …如果G有一个尾随函数参数包,而F没有相应的参数,并且如果F没有尾随函数参数包,则F比G更专业化

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

#包括
甲级{
公众:
模板
void Foo(int={}){
std::cout对于调用
Foo()
编译器可以为第一个模板推断
Foo()
,为第二个模板推断
Foo(void)

发件人:

…如果G有一个尾随函数参数包,而F没有相应的参数,并且如果F没有尾随函数参数包,则F比G更专业化

这是一个平局断路器,并且选择了第一个模板

无法解决歧义似乎是MSVC的一个缺陷

#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>();
}