ホームページ > バックエンド開発 > C++ > 定数式で関数パラメータを使用できないのはなぜですか?

定数式で関数パラメータを使用できないのはなぜですか?

Patricia Arquette
リリース: 2024-11-15 08:26:02
オリジナル
1084 人が閲覧しました

Why Can't I Use Function Parameters in Constant Expressions?

定数式で関数パラメーターを使用できないのはなぜですか?

定数式は、コンパイル時に評価できる式です。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート