constexpr

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