私はEffective Modern C++を読んでいて、consexpressionsを使った非常に基本的な関数を試してみたいと思っていました. 私の C++ のスキルはあまり高くありませんが、この基本的なコードの何が問題なのかわかりません。
constexpr int test( int x ) {
// works if: return x == 43337, otherwise segmentation fault
return x > 1000000 ? x+1 : test( x + 1 );
}
int main(int argc, char const *argv[])
{
constexpr auto x = 0;
cout << "Result: " << test( x );
return 0;
}
コメントで述べたように、このコードは return x == 43337 を使用すると機能しますが、値が大きいとセグメンテーション エラーが発生します。
このコードの何が問題になっていますか? 制約を正しく理解していれば、計算はコンパイル時に行われるはずですが、実行時に計算が行われるようです。また、コールスタックが深くなりすぎるため、値が大きいとセグメンテーション違反が発生するようです。
ただし、コンパイル時に計算が行われる必要があるため、コンパイルエラーが発生しない理由がわかりません(明らかにそうではありません)。
さらに、メソッドの署名が次のようになっている場合、このコードは機能しますか?
constexpr decltype(auto) test( int x )