「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C++17 の非テンプレート関数で「if constexpr」を使用できないのはなぜですか?

C++17 の非テンプレート関数で「if constexpr」を使用できないのはなぜですか?

2024 年 11 月 26 日に公開
ブラウズ:622

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17 の "if constexpr" はテンプレート関数に限定されています

C 17 では、"if constexpr" の導入により、コンパイル時の定数に基づいて条件付きでコードを実行する機能。ただし、テンプレート化されていない関数で使用しようとすると問題が発生します。

次のコードを検討してください:

#include 
#include 

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v)
    std::cout 

このコードはテンプレート関数ではエラーなしでコンパイルされますが、print などの非テンプレート関数に配置するとコンパイル エラーで失敗します。その理由は、「if constexpr」の動作にあります。

「if constexpr」は、テンプレート コードの条件付きコンパイルを可能にするように設計されています。テンプレート関数では、コンパイラはコンパイル時にパラメータの型を推定し、型に基づいて適切なコード パスを選択できるようにします。この場合、print 関数がテンプレート化されている場合、コンパイル時に値がポインターであるかどうかを識別し、対応するコード分岐を実行できます。

ただし、テンプレート化されていない関数では、値の型がわかっています。実行時のみなので、「if constexpr」は無効になります。コンパイラは条件分岐の両方を実行可能コードとして扱うため、値が整数の場合に分岐するために Ptr 内の値を逆参照しようとするとコンパイル エラーが発生します。この問題を回避するには、「」を配置する必要があります。 if constexpr" をテンプレート関数内に追加するか、テンプレート化されていない関数に明示的な型情報を指定して、コンパイル時の型推論を保証します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3