Подтвердить что ты не робот

Почему перегрузка шаблона и функции без шаблона с "той же сигнатурой" вызывает функцию без шаблона?

У меня есть этот код:

template<
    class T = const int &
> void f(T) {}

void f(const int &) {}

int main() {
   f(0);
}

Почему он вместо второго вызывает второй? Я бы подумал, что они такие же, но они явно не такие, как я не получаю ошибку переопределения.

4b9b3361

Ответ 1

Потому что вторая перегрузка не является шаблоном.

Когда функция шаблона и функция без шаблона являются жизнеспособными для разрешения вызова функции, выбирается функция без шаблона.

Из пункта 13.3.3/1 стандарта С++ 11:

[...] Учитывая эти определения, жизнеспособная функция F1 определяется как лучшая функция, чем другая жизнеспособная функция F2, если для всех аргументов я ICSi (F1) не хуже конверсии последовательность, отличная от ICSi (F2), , а затем [...] F1 является нешаблонной функцией, а F2 - специализированной функцией [...]

Ответ 2

Один шаблон, а другой нет, они определенно не совпадают.

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