Ответ 1
N
не получает "инициализировано" ни к чему. Это не переменная. Это не объект. N
- константа времени компиляции. N
существует только во время компиляции. Значение N
, а также фактическое T
определяется процессом, называемым выводом аргумента шаблона. Оба T
и N
выводятся из фактического типа аргумента, который вы передаете своей функции шаблона.
В первом вызове тип аргумента int[6]
, поэтому компилятор выводит, что T == int
и N == 6
, генерирует для него отдельную функцию и вызывает ее. Назовите его cal_size_int_6
void cal_size_int_6(int (&a)[6])
{
std::cout << "size of array is: " << 6 << std::endl;
}
Обратите внимание, что в этой функции больше нет T
и no N
. Оба были заменены фактическими значениями, полученными при компиляции.
В первом вызове тип аргумента int[1]
, поэтому компилятор выводит, что T == int
и N == 1
, генерирует отдельную функцию для этого и вызывает его. Назовите его cal_size_int_1
void cal_size_int_1(int (&a)[1])
{
std::cout << "size of array is: " << 1 << std::endl;
}
То же самое здесь.
Ваш main
по существу переводится в
int main()
{
int a[]={1,2,3,4,5,6};
int b[]={1};
cal_size_int_6(a);
cal_size_int_1(b);
}
Другими словами, ваш шаблон cal_size
генерирует две разные функции (так называемые специализации исходного шаблона), каждая из которых имеет разные значения N
(и T
), жестко закодированные в теле. То, как работают шаблоны на С++.