C 17 の "if constexpr" はテンプレート関数に限定されています
C 17 では、"if constexpr" の導入により、その機能への関心が高まりました。コンパイル時の定数に基づいて条件付きでコードを実行する機能。ただし、テンプレート化されていない関数で使用しようとすると問題が発生します。
次のコードを考えてみましょう:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { // Compile-time check if value is a pointer if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { // Error when printing a non-pointer print(100); }</code>
このコードは、テンプレート化された関数ではエラーなしでコンパイルされますが、エラーで失敗します。 print のような非テンプレート関数に配置するとコンパイル エラーが発生します。その理由は、「if constexpr」の動作にあります。
「if constexpr」は、テンプレート コードの条件付きコンパイルを可能にするように設計されています。テンプレート関数では、コンパイラはコンパイル時にパラメータの型を推定し、型に基づいて適切なコード パスを選択できるようにします。この場合、print 関数がテンプレート化されている場合、コンパイル時に値がポインターであるかどうかを識別し、対応するコード分岐を実行できます。
ただし、テンプレート化されていない関数では、値の型がわかっています。実行時のみなので、「if constexpr」は無効になります。コンパイラは条件分岐の両方を実行可能コードとして扱うため、値が整数の場合に分岐するために Ptr 内の値を逆参照しようとするとコンパイル エラーが発生します。
この問題を回避するには、「」を配置する必要があります。 if constexpr" をテンプレート関数内に追加するか、テンプレート化されていない関数に明示的な型情報を指定して、コンパイル時の型推論を保証します。
以上がC 17 の非テンプレート関数で「if constexpr」を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。