Что выведет код Middle Шаблоны и концепты обновлено

Что выведет: шаблон против обычной функции

Вопрос

Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.

#include <iostream>

void f(int) { std::cout << "int\n"; }

template <class T>
void f(T) { std::cout << "T\n"; }

template <>
void f<double>(double) { std::cout << "double\n"; }

int main() {
    f(1);
    f(1.0);
    f('a');
    f<int>(1);
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: int, double, T, T. f(1): нешаблонная f(int) и шаблон с T = int совпадают одинаково точно, при равенстве выигрывает нешаблонная. f(1.0): подходит только шаблон с T = double, а для него есть полная специализация. f('a'): шаблон с T = char даёт точное…

Что выведет

int
double
T
T

Разбор

f(1): нешаблонная f(int) и шаблон с T = int совпадают одинаково точно, при равенстве выигрывает нешаблонная. f(1.0): подходит только шаблон с T = double, а для него есть полная специализация. f('a'): шаблон с T = char даёт точное совпадение, а f(int) требует продвижения char в int, поэтому шаблон. f<int>(1): явные аргументы шаблона отсекают нешаблонную функцию.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.