Что выведет: шаблон против обычной функции
Вопрос
Что выведет программа (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 даёт точное совпадение, а f(int) требует продвижения char в int, поэтому шаблон. f<int>(1): явные аргументы шаблона отсекают нешаблонную функцию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Возможность шаблонов и стандарт, где она появилась
Следующий вопрос
Что выведет: sizeof..., fold и статический член шаблона
Ещё по теме «Шаблоны и концепты»
- Дерево отрезков с операцией как параметром шаблона
- Обобщённая функция статистики для чисел и строк
- Один бинарный поиск на все случаи: предикат как параметр шаблона
- Зачем концепты
- Концепты против SFINAE
- Вывод аргументов шаблона класса
- Вывод T при передаче по значению
- Член зависимой базы