ホームページ >バックエンド開発 >C++ >テンプレート化されていない C 関数で「if constexpr」が期待どおりに動作しないのはなぜですか?

テンプレート化されていない C 関数で「if constexpr」が期待どおりに動作しないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 10:54:02571ブラウズ

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

C 17 の constexpr が非テンプレート関数で動作しない

はじめに

C 17 標準では、定数式に基づいた条件付き実行を可能にする if constexpr 構造が導入されました。ただし、テンプレート化された関数とテンプレート化されていない関数で使用した場合、constexpr の動作が異なることが観察されています。

問題

次の非テンプレート関数を考えてみましょう:

<code class="cpp">void print()
{
  auto value = 100;
  if constexpr (std::is_pointer_v<decltype(value)>){
    std::cout << "Ptr to " << *value << std::endl; // Error
  }
  else {
    std::cout << "Ref to " << value << std::endl;
  }
}</code>

*value が推定型 int に対して無効であるため、このコードはコンパイル エラーになります。

回答

この動作は仕様です。テンプレート関数では、constexpr を使用すると、特定のテンプレート特殊化に対して無効な分岐のインスタンス化を回避できます。ただし、テンプレート化されていない関数では、if constexpr は、分岐しなかった分岐のコンパイルを抑制しません。

分岐しなかった分岐が無効であっても、if constexpr ステートメントの両方の分岐が解析および分析されます。したがって、上記のコードでは、コンパイラは int 型の *value を評価しようとし、エラーが発生します。

結論

この区別を理解することが重要です。 if constexpr を使用する場合。テンプレート化されていない関数では、入力パラメーターのすべての可能な値に対して有効であることが保証されている定数式をチェックするためにのみ使用する必要があります。

以上がテンプレート化されていない C 関数で「if constexpr」が期待どおりに動作しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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