Следующая программа печатает T,T
.
#include <iostream>
template<typename T>
void f(T x, T y) {
std::cout << "T,T\n";
}
template<typename T1, typename T2>
void f(T1 x, T2 y) {
std::cout << "T1,T2\n";
}
int main() {
f(1, 1);
return 0;
}
Не имеет значения, какой шаблон стоит первым в коде.
Я бы ожидал, что разрешение перегрузки здесь будет неоднозначным.T
, T1
и T2
должны быть выведены как int
, что делает оба шаблона точно совпадающими с сайтом вызова.
Я не смог найти никаких правил разрешения (https://en.cppreference.com/w/cpp/language/overload_resolution), чтобы объяснить, почему он выбрал бы первый шаблон.
Я проверил с clang++ -std=c++17
, на случай, если это имеет значение.