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)
。
... 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 错误。
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)
。
... 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 错误。