constexprは、定数式であることを示すキーワード。
constexpr - cpprefjp C++日本語リファレンス
constexprは、コンパイル時に評価されるので、
factorial(10)の値cはコンパイル時には決定されている。
一方で、factorial(10)の値rは実行時に評価される。
10の階乗は3628800なので、このままだと、
$ vi constexpr.cpp $ g++ constexpr.cpp -o constexpr -std=c++11 constexpr.cpp: 関数 ‘int main()’ 内: constexpr.cpp:18:3: エラー: static assertion failed: c == 3628800 ! static_assert(c != 3628800, "c == 3628800 !"); // static_assertで, cが3628800ならアサーション. ^~~~~~~~~~~~~ $
こうなる。
// コンパイル時評価. //constexpr int c = factorial(10); // factorial(10)の評価をコンパイル時に受け取る. //static_assert(c != 3628800, "c == 3628800 !"); // static_assertで, cが3628800ならアサーション.
とコメントすると、コンパイルは通るが実行時に、
$ vi constexpr.cpp $ g++ constexpr.cpp -o constexpr -std=c++11 $ ./constexpr constexpr: constexpr.cpp:22: int main(): Assertion `r != 3628800' failed. Aborted (コアダンプ) $
となる。
Sample/cpp/constexpr/constexpr/src/constexpr at master · bg1bgst333/Sample · GitHub