如果我使用specialized编写编译时阶乘函数,下面的代码就足够了,并且fact1<5>()
会正确地提供120:
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>(); }
答案 0 :(得分:7)
这里的问题是无论如何,fact2<N-1>
总是被实例化(甚至需要编译非执行路径,请参阅有效的C ++,我认为第47或48项) 。如果你不在最后,你需要以某种方式使它只实例化下一个函数。一种方法是简单地说“螺丝模板”并按照通常的constexpr
方式进行,正如@NicolBolas在评论中所说的那样。
另一种方法是使用this similar question中使用的一种技术。