ホームページ >バックエンド開発 >C++ >C 17 の非テンプレート関数で「if constexpr」を使用できないのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 04:13:02562ブラウズ

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

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 サイトの他の関連記事を参照してください。

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