Почему программа выводит 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
зависит от того, хотите ли вы поддерживать константность параметра внутри функции или нет. Но важно это только лишь при определении функции (реализации её тела), а не при объявлении.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как передать в шаблон с параметром-функцией лямбду? Почему так не работает?
Задача: В одномерном целочисленном массиве (размер массива (не больше 20) и значения его элементов вводить с клавиатуры) вычислить сумму элементов...