Одинаковы ли типы const int и int в шаблонах?

131
01 мая 2019, 01:00

Почему программа выводит 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>();
}
Answer 1

При выведение типов параметра шаблона (если есть из чего выводить) 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 зависит от того, хотите ли вы поддерживать константность параметра внутри функции или нет. Но важно это только лишь при определении функции (реализации её тела), а не при объявлении.

READ ALSO
Передача лямбды шаблонной функции

Передача лямбды шаблонной функции

Как передать в шаблон с параметром-функцией лямбду? Почему так не работает?

196
Как можно упростить данный код на с++?

Как можно упростить данный код на с++?

Задача: В одномерном целочисленном массиве (размер массива (не больше 20) и значения его элементов вводить с клавиатуры) вычислить сумму элементов...

160