Повторно создается шаблон f1<N>
с уменьшением значений для N
(f1<N>()
вызывает f1<N-1>
и т. Д.).Явная специализация для N==1
завершает рекурсию: как только N
становится 1, компилятор выбирает специализированную функцию, а не шаблонную.
f1<1000>()
заставляет компилятор создавать экземпляр f1<N>
999 раз (не считая при последнем звонке на f1<1>
).По этой причине компиляция кода, интенсивно использующего методы метапрограммирования шаблонов, может занять некоторое время.
Все это в значительной степени зависит от навыков оптимизации компилятора - в идеале, он должен удалить рекурсию (котораяслужит только для взлома, чтобы полностью эмулировать цикл for
с использованием шаблонов).