提供されたコードは、次のことを行う試みを示しています。定数式内で constexpr 関数 make_const の戻り値を利用しますが、 error.
static constexpr int make_const(const int i) { return i; } void t1(const int i) { constexpr int ii = make_const(i); // Error occurs here (i is not a constant expression) std::cout << ii; } int main() { t1(12); // Call the function }
一般的な考えに反して、constexpr 関数はコンパイル時に魔法のようにパラメーターを評価させるわけではありません。代わりに、入力引数から出力への constexprness の伝播が可能になります。ただし、指定されたコードでは、関数パラメーター i は constexpr ではないため、constexpr 関数 make_const はそれを constexpr に変換できません。
後続の代入 constexpr int ii = make_const(i) が試行するため、エラーが発生します。 constexpr 変数を宣言します (ii) 非 constexpr 式 (make_const(i)) の結果で初期化されます。 constexpr 変数は常に constexpr 式で初期化する必要があるため、これは許可されません。
constexpr 関数には、次の 2 つの重要な特性があります。
エラーを解決するには、関数パラメータ自体がconstexpr。これは、関数宣言を次のように変更することで実現できます。
constexpr int make_const(constexpr int i) { return i; }
この変更により、関数が constexpr 入力を constexpr 出力に効果的に変換できることが保証され、定数式内で関数を意図した使用が可能になります。
提供されている代替コード例では、パラメータが次のようになっているため、関数 make_const を t1 の constexpr 式として呼び出すことができます。 constexpr。ただし、関数は constexpr の実行に constexpr 引数を必要とするため、非 constexpr 式 (ランタイム変数など) の結果を関数に渡そうとすると、やはりエラーが発生します。
以上が定数式で「constexpr」関数の関数パラメータを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。