Разрешение перегрузки вызовов шаблонов функций
Шаблон функции может перегружать функции, отличные от шаблона, с тем же именем. В этом сценарии компилятор сначала пытается разрешить вызов функции с помощью вычета аргумента шаблона для создания экземпляра шаблона функции с уникальной специализацией. Если вычет аргументов шаблона завершается ошибкой, компилятор рассматривает как перегрузки шаблонов функций экземпляров, так и перегрузки функций, отличных от шаблона, для разрешения вызова. Эти другие перегрузки называются набором кандидатов. Если вычет аргументов шаблона выполнен успешно, то созданная функция сравнивается с другими функциями в наборе кандидатов, чтобы определить лучшее соответствие, следуя правилам разрешения перегрузки. Дополнительные сведения см. в разделе "Перегрузка функций".
Пример. Выбор функции, отличной от шаблона
Если функция, не являющейся шаблоном, является одинаково хорошим совпадением с шаблоном функции, функция, не являющейся шаблоном, выбирается (если аргументы шаблона не были явно указаны), как показано в вызове f(1, 1)
в следующем примере.
// template_name_resolution9.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void f(int, int) { cout << "f(int, int)" << endl; }
void f(char, char) { cout << "f(char, char)" << endl; }
template <class T1, class T2>
void f(T1, T2)
{
cout << "void f(T1, T2)" << endl;
};
int main()
{
f(1, 1); // Equally good match; choose the non-template function.
f('a', 1); // Chooses the function template.
f<int, int>(2, 2); // Template arguments explicitly specified.
}
f(int, int)
void f(T1, T2)
void f(T1, T2)
Пример: предпочтительный шаблон функции точного сопоставления
В следующем примере показано, что шаблон функции точно совпадает, если для функции, отличной от шаблона, требуется преобразование.
// template_name_resolution10.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void f(int, int) { cout << "f(int, int)" << endl; }
template <class T1, class T2>
void f(T1, T2)
{
cout << "void f(T1, T2)" << endl;
};
int main()
{
long l = 0;
int i = 0;
// Call the function template f(long, int) because f(int, int)
// would require a conversion from long to int.
f(l, i);
}
void f(T1, T2)
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по