特殊化を使用してコンパイル時の階乗関数を作成する場合、次のコードで十分であり、次の結果として120を正しく提供しますfact1<5>()
。
template <size_t N>
constexpr size_t fact1() { return N*fact1<N-1>(); }
template <>
constexpr size_t fact1<0>() { return 1; }
ただし、次のコードのように、単一の関数本体と3項演算子を使用すると、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>(); }