Я вполне уверен, что это зависит от компилятора; некоторые компиляторы могут попытаться сгенерировать обе ветви if
/ else
независимо от значения N
, и в этом случае компиляция завершится неудачей в любом случае. Другие компиляторы могут оценивать условие во время компиляции и генерировать код только для ветви, которая выполняется, и в этом случае компиляция будет успешной.
ОБНОВЛЕНИЕ: Или, как говорит Люк в комментариях, может случиться так, что компилятор должен сгенерировать обе ветви, так что код всегда будет терпеть неудачу. Я не совсем уверен, что именно так, но в любом случае плохая идея полагаться на условия времени выполнения для управления генерацией кода во время компиляции.
Было бы лучше использовать специализацию:
template <int N>
struct NumberGeneration
{
static void out(std::ostream & os)
{
NumberGeneration<N-1>::out(os);
os << N << std::endl;
}
};
template <>
void NumberGeneration<1>::out(std::ostream & os)
{
os << 1 << std::endl;
}
(или вы могли бы немного сократить это, вместо этого специализировавшись на N=0
, с функцией out
, которая ничего не делает).
Также помните, что некоторые компиляторы могут не поддерживать глубоко ресурсоемкие шаблоны; C ++ 03 предлагает минимальную поддерживаемую глубину только 17, которую C ++ 11 увеличивает до 1024. Вы должны проверить, каков предел вашего компилятора.