Почему программа выводит 00, ведь const int = int, то есть вызов идёт к одной и той же функции, а значит статическая переменная увеличится на единицу и должно быть 01? Или const int и int - разные типы? Почему тогда в параметрах обычной функции они одинаковые?
#include <iostream>
template <typename T>
void f() {
static int check = 0;
std::cout << check++;
}
int main() {
f<int>();
f<const int>();
}
При выведение типов параметра шаблона (если есть из чего выводить) const верхнего уровня игнорируется. Т.е. если функция принимает параметр типа T:
template <typename T>
void f(T) { }
Следующие вызовы:
int i = 42;
const int c = 100500;
f(i);
f(c);
f(0);
все приведут к тому, что тип T определяется как int. Инстанцируется только одна функция из шаблона. Если передавать тип явно (например, если нет параметров), как это сделано у вас, то безусловно разные типы (а const int и int это разные типы) породят разные функции из шаблона, т.к. эти типы не выводились автоматически из параметров при вызове.
В параметрах обычных функций типы отличающиеся только const верхнего уровня неразличимы, например:
void f(int) {}
void f(const int) {}
Эти функции будут восприняты компилятором как одинаковые функции (породит ошибку компиляции).
Точно так же ведут себя и шаблонные функции с параметром:
template <typename T>
void f(const T) { }
template <typename T>
void f(T) { }
Приводит к ошибке:
error: redefinition of 'f'
Однако, на каком варианте остановиться в итоге T или const T зависит от того, хотите ли вы поддерживать константность параметра внутри функции или нет. Но важно это только лишь при определении функции (реализации её тела), а не при объявлении.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости