具有三元的简单C++ 11 constexpr阶乘超过最大模板深度

use*_*370 4 c++ recursion templates constexpr c++11

如果我使用specialized编写一个编译时阶乘函数,下面的代码就足够了,并且正确地提供120作为结果fact1<5>():

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

template <>
constexpr size_t fact1<0>() { return 1; }
Run Code Online (Sandbox Code Playgroud)

但是,对于单个函数体和三元运算符,如下面的代码所示,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>(); }
Run Code Online (Sandbox Code Playgroud)

Xeo*_*Xeo 7

这里的问题是,不管是什么,fact2<N-1>永远被实例化(甚至非执行路径需要被编译,看C++有效,我认为项目47或48).如果你不在最后,你需要以某种方式使它只实例化下一个函数.一种方法是简单地说"螺丝模板"并按照通常的constexpr方式进行,正如@NicolBolas在他的评论中所说的那样.

另一种是使用这个类似问题中使用的技术之一.