ユーザー定義のリテラル引数はconstexprではありませんか?

私はユーザー定義のリテラルをテストしています。 _fac に数値の階乗を戻したいと思います。

constexpr 関数を呼び出すと、コンパイラは引数がなく、
constexpr できないと文句を言います。

私はこれで混乱しています – リテラル定数式ではありませんか? 5_fac
5 は常にコンパイル時に評価できるリテラルなので、どうしてこのように使うことはできませんか?

最初の方法:

constexpr int factorial_function(int x) {
  return (x > 0) ? x * factorial_function(x - 1) : 1;
}

constexpr int operator "" _fac(unsigned long long x) {
  return factorial_function(x);//this works
}

第2の方法:

template  struct factorial_template {
  static const unsigned int value = N * factorial_template::value;
};
template <> struct factorial_template<0> {
  static const unsigned int value = 1;
};

constexpr int operator "" _fac(unsigned long long x) {
  return factorial_template::value;//doesn't work - x is not a constexpr
}
ベストアンサー

私はC ++ 11でこれを行うより良い方法が現在の受け入れられた答えよりも良いのかどうか分かりませんが、C ++ 14で緩やかな
constexpr を使うと、

constexpr unsigned long long int operator "" _fac(unsigned long long int x) {
    unsigned long long int result = 1;
    for (; x >= 2; --x) {
        result *= x;
    }
    return result;
}

static_assert(5_fac == 120, "!");

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です