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
また、この論文では、パラメータがコアの定数式として扱われないことを次の例で説明しています。
<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 サイトの他の関連記事を参照してください。