C++, какой шаблон будет вызываться, если обе функции шаблона соответствуют списку аргументов

template<class T>
void fn(T t){}

template<class T>
void fn(std::vector<T> vt){}

void f() {
std::vector<int> vt;
fn(vt);
}

Я знаю, что будет вызвана вторая функция шаблона, но я не знаю правил сопоставления функций шаблона.

1 ответ

Решение

Частичное упорядочивание выполняется в разрешении перегрузки для вызова специализации шаблона функции.

Неформально "A более специализирован, чем B" означает "A принимает меньше типов, чем B".

В этом случае 2-й fn является более специализированным и выигрывает в разрешении перегрузки, потому что он принимает типы экземпляров std::vector это меньше, чем 1-й, который может принимать все типы.

Другие вопросы по тегам