Этот вопрос просто из любопытства. В рекурсивных шаблонах, если мы забудем указать одну конкретную специализацию, компилятор выполнит большое количество итераций, а затем остановится в какой-то момент и выдаст ошибку, например,
error: incomplete type ‘X<-0x000000000000001ca>’ used in nested name specifier
В некоторых случаях компиляция идет бесконечно . Например, см. Приведенный ниже код (только для иллюстрации; скомпилирован с помощью gcc 4.4.1):
template<int I>
struct Infinite
{
enum { value = (I & 0x1)? Infinite<I+1>::value : Infinite<I-1>::value };
};
int main ()
{
int i = Infinite<1>::value;
}
Разве компилятор не должен быть достаточно умным, чтобы остановиться в какой-то момент?
Изменить : Показанная выше ошибка компиляции предназначена для другой код. Для примера кода компиляция никогда не останавливается (однако я могу видеть такие ошибки между ними)