Я не понимаю следующее поведение.
Следующий код, предназначенный для вычисления факториала во время компиляции, даже не компилируется:
#include <iostream>
using namespace std;
template<int N>
int f() {
if (N == 1) return 1; // we exit the recursion at 1 instead of 0
return N*f<N-1>();
}
int main() {
cout << f<5>() << endl;
return 0;
}
и выдает следующую ошибку:
...$ g++ factorial.cpp && ./a.out
factorial.cpp: In instantiation of ‘int f() [with int N = -894]:
factorial.cpp:7:18: recursively required from ‘int f() [with int N = 4]
factorial.cpp:7:18: required from ‘int f() [with int N = 5]
factorial.cpp:15:16: required from here
factorial.cpp:7:18: fatal error: template instantiation depth exceeds maximum of 900 (use ‘-ftemplate-depth= to increase the maximum)
7 | return N*f<N-1>();
| ~~~~~~^~
compilation terminated.
тогда как при добавлении специализации для N == 0
(которой шаблон выше даже не достигает),
template<>
int f<0>() {
cout << "Hello, I'm the specialization.\n";
return 1;
}
код компилируется и выдает правильный вывод, даже если специализация никогда не используется:
...$ g++ factorial.cpp && ./a.out
120