定数式は、コンパイル時に評価できる式です。 Constexpr 関数は、constexpr パラメーターを指定して呼び出された場合にコンパイル時に評価できる関数です。
コード内の make_const 関数は constexpr 関数です。ただし、t1 のパラメーター i は const として指定されていないため、constexpr パラメーターではありません。
void t1(const int i) { constexpr int ii = make_const(i); // error: i is not a constant expression }
これを修正するには、型を const int に変更して i を定数パラメーターにするか、またはt1 を constexpr 関数自体として定義することによって:
void t1(const int i) // const int i to make i a constant parameter { constexpr int ii = make_const(i); }
constexpr int t1(const int i) // constexpr t1 to make t1 a constexpr function { return make_const(i); }
を使用すると、別の問題が発生します。 constexpr 値を返すことを目的としたテンプレート関数内の constexpr 関数。
template<int i> constexpr bool do_something(){ return i; } constexpr int t1(const int i) { return do_something<make_const(i)>(); // error: i is not a constant expression }
この場合、パラメーター i はテンプレートの値に依存するため、コンパイラーはパラメーター i が定数式であることを保証できません。 do_something に渡されるパラメータ。 t1 がコンパイル時に確実に評価されるようにするには、テンプレート パラメーター i は定数式である必要があります。
別のアプローチは、std::variant および std::integral_constant を使用してコンパイル時定数を作成することです。実行時の値と組み合わせて使用できます。
template<auto I> using constant_t=std::integral_constant<decltype(I),I>; template<auto I> constexpr constant_t<I> constant_v={}; template<auto...Is> using var_enum_t=std::variant<constant_t<Is>...>;
これにより、次を使用して実行時に選択できるコンパイル時の定数バリアントを作成できます。 std::visit.
auto idx=var_index<5>(3/* 3 can be runtime */); std::visit([](auto three){ // three is a compile time value here }, idx);
以上が定数式で関数パラメータを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。