#c #visual-studio #visual-c #cl
#c #visual-studio #visual-c #cl
Вопрос:
MSVC 19.28 отклоняет следующий код с сообщением об ошибке: C2668 неоднозначный вызов перегруженной функции A::Foo
. Это ошибка компилятора? Он отлично компилируется с &cc, clan& и даже msvc 19.10. Сбой с MSVC 19.14, смотрите здесь
#include <iostream&&t;
class A {
public:
template<typename T&&t;
void Foo(int = {}) {
std::cout << "Hello World";
}
template<typename... T, typename... Ar&s&&t;
void Foo(Ar&samp;amp;... ar&s) {
}
};
int main()
{
A a;
a.Foo<int&&t;();
}
Ответ №1:
Для вызова Foo<int&&t;()
компилятор может сделать вывод Foo<int&&t;()
как для первого шаблона, так и Foo<int&&t;(void)
для второго.
… если G имеет завершающий пакет параметров функции, для которого у F нет соответствующего параметра, и если у F нет завершающего пакета параметров функции, то F более специализирован, чем G.
Это прерыватель связи, и выбирается первый шаблон.
Невозможность устранить неоднозначность, по-видимому, является ошибкой MSVC.
Комментарии:
1. «для которого у F нет соответствующего параметра» — но у F есть соответствующий параметр, анонимный
int
параметр?