ホームページ  >  記事  >  バックエンド開発  >  Consteval 関数では、関数の引数に依存するテンプレート パラメーターを許可できますか?

Consteval 関数では、関数の引数に依存するテンプレート パラメーターを許可できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 01:35:01390ブラウズ

Can Consteval Functions Allow Template Parameters Reliant on Function Arguments?

Consteval 関数は関数の引数に依存するテンプレート パラメーターを有効にできますか?

C 17 では、以下のスニペットのような constexpr 関数は無効です。

<code class="cpp">constexpr int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

コンパイル時に foo が評価されるにもかかわらず、コンパイラはそれが実行時に実行可能であることを要求し、テンプレートのインスタンス化を妨げます。

C 20 では、コンパイル時に評価を強制する consteval 関数が導入されています。これで次のようなコードが許可されるのではないかと疑問に思う人もいるかもしれません:

<code class="cpp">consteval int foo(int i) {
    return std::integral_constant<int, i>::value;
}</code>

答えは いいえです。

論文の潜在的な変更は、非テンプレートの単一の型付けを変更することはできません。関数の定義。さらに、このコードが有効であれば、std::integral_constant 型の変数を宣言できる可能性が生じますが、これは One Definition Rule (ODR) の観点から非常に制限的であると思われます。

また、この論文では、パラメータがコアの定数式として扱われないことを次の例で説明しています。

<code class="cpp">consteval int sqrsqr(int n) {
  return sqr(sqr(n)); // Not a constant-expression at this point, but that's okay.
}</code>

本質的に、関数パラメータは、潜在的な型付けの不一致により、常に定数式ステータスを欠きます。

以上がConsteval 関数では、関数の引数に依存するテンプレート パラメーターを許可できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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