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; }

ただし、次のコードのように、単一の関数本体と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>(); }
4

1 に答える 1

7

ここでの問題は、何がfact2<N-1>あっても常にインスタンス化されることです (実行されていないパスもコンパイルする必要があります。Effective C++ を参照してください。項目 47 または 48 だと思います)。どういうわけか、最後にいない場合にのみ次の関数をインスタンス化する必要があります。constexpr1つの方法は、@NicolBolasが彼のコメントで述べているように、「スクリューテンプレート」と言って通常の方法で行くことです。

もう 1 つは、この同様の質問で使用されている手法の 1 つを使用することです。

于 2012-09-03T21:46:49.423 に答える