Generalized Constant Expressions—Revision 5によると、以下は違法です。
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
int r = n;
while (--n > 1) r *= n;
return r;
}
これは、すべての 'constexpr' 関数が の形式である必要があるため{ return expression; }
です。これがそうである必要がある理由はわかりません。
私の考えでは、本当に必要な唯一のことは、外部状態情報が読み書きされず、渡されるパラメーターも「constexpr」ステートメントであることです。これは、同じパラメーターを使用して関数を呼び出しても同じ結果が返されることを意味するため、コンパイル時に「知る」ことができます。
これに関する私の主な問題は、ループの実際のラウンドアバウト形式を強制し、コンパイラがそれを最適化して、非 constexpr 呼び出しと同じくらい高速になることを望んでいるように見えることです。
constexpr
上記の例に有効なコードを記述するには、次のようにします。
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
return (n <= 1) ? n : (n * g(n-1));
}
しかし、これは理解するのがはるかに難しく、 の要件に違反するパラメーターを使用して呼び出すときに、コンパイラーが末尾再帰を処理することを期待する必要がありますconst-expr
。