4

如果我使用专业化编写编译时阶乘函数,则以下代码就足够了,并且将正确提供 120 作为结果fact1<5>()

template <size_t N>
constexpr size_t fact1() { return N*fact1<N-1>(); }

template <>
constexpr size_t fact1<0>() { return 1; }

但是,对于单个函数体和三元运算符,如下面的代码所示,G++ 4.7 和 Clang++ 3.2 都超过了它们的最大模板实例化深度。似乎1永远不会从fact2. 为什么这个定义fact2<5>()不返回 120?

template <size_t N>
constexpr size_t fact2() { return N==0 ? 1 : N*fact2<N-1>(); }
4

1 回答 1

7

这里的问题是,无论如何,fact2<N-1>总是被实例化(即使是非执行路径也需要编译,参见 Effective C++,我认为 Item 47 或 48)。如果您不在最后,您需要以某种方式使其仅实例化下一个函数。一种方法是只说“螺丝模板”并constexpr按照@NicolBolas 在他的评论中所说的通常方式进行。

另一个将使用在这个类似问题中使用的技术之一。

于 2012-09-03T21:46:49.423 回答