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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-14 15:06:021049ブラウズ

Why Can't I Use a Function Parameter of a `constexpr` Function in a Constant Expression?

定数式では constexpr 関数の関数パラメーターを使用できません

問題の概要とコード例

提供されたコードは、次のことを行う試みを示しています。定数式内で 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 関数について

constexpr 関数には、次の 2 つの重要な特性があります。

  • ドキュメント: constexpr 引数が指定された場合、関数がコンパイラーに指示されます。
  • 命令: constexpr 式を必要とする特定のコンテキストで関数が使用される場合、コンパイラにコンパイル時に関数を評価するように指示します。

解決策

エラーを解決するには、関数パラメータ自体がconstexpr。これは、関数宣言を次のように変更することで実現できます。

constexpr int make_const(constexpr int i) {
    return i;
}

この変更により、関数が constexpr 入力を constexpr 出力に効果的に変換できることが保証され、定数式内で関数を意図した使用が可能になります。

提供されている代替コード例では、パラメータが次のようになっているため、関数 make_const を t1 の constexpr 式として呼び出すことができます。 constexpr。ただし、関数は constexpr の実行に constexpr 引数を必要とするため、非 constexpr 式 (ランタイム変数など) の結果を関数に渡そうとすると、やはりエラーが発生します。

以上が定数式で「constexpr」関数の関数パラメータを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。