0

私は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 )

4

1 に答える 1