Consteval 関数とテンプレート パラメーターの関数引数への依存
C 17 では、テンプレート パラメーター宣言内で直接定数を返す関数を使用する実行時の実行制約により禁止されています。 C 20 での consteval 関数の導入により、これらの制約は削除されることが期待されます。しかし、これにより、次のコードは正常にコンパイルできるようになりますか?
<code class="cpp">consteval int foo(int i) { return std::integral_constant<int, i>::value; }</code>
いいえ。
consteval 関数のコンパイル時評価要件にもかかわらず、関数定義自体は1 回の入力が行われます。そのため、型付けの不一致が発生する可能性があるため、関数パラメーターはコア定数式として扱われることはありません。
この制限は C 20 提案でさらに強調されており、その例では定数式の考慮からパラメーターを明示的に除外しています。 :
<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 関数ではテンプレート パラメータが関数の引数に依存することはできません。
以上がConsteval 関数は、C 20 の関数引数に対するテンプレート パラメーターの依存性を有効にできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。