我正在阅读对"Printing 1 to 1000 without loop or conditionals"的答复,我想知道为什么有必要在顶部答案中使用NumberGeneration 的特殊情况。

如果删除该代码,并在模板中添加N == 1的检查(以下代码),则代码编译失败,出现“模板实例化深度超过最大值”,但我不确定原因。在编译时条件处理是否不同?

#include <iostream>

template<int N>
struct NumberGeneration
{
    static void out(std::ostream& os)
    {
        if (N == 1)
        {
            os << 1 << std::endl;
        }
        else
        {
            NumberGeneration<N-1>::out(os);
            os << N << std::endl;
        }
    }
};

int main()
{
    NumberGeneration<1000>::out(std::cout);
}

最佳答案

代码生成和编译不会根据条件分支!考虑一下:

// don't declare bar()!

void foo()
{
     if (false) { bar(); }
}

如果您从不声明bar(),即使永远无法达到内部作用域,这也是编译错误。出于同样的原因,无论是否可以到达该分支,NumberGeneration<N-1>总是实例化,并且您具有无限递归。

实际上,条件语句的静态类似物恰好是模板专门化:
template <> struct NumberGeneration<0> { /* no more recursion here */ };

08-16 23:59