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