C 17 の非テンプレート関数で "If constexpr" を使用する際のエラー
C 17 では、"if constexpr" ステートメントにより次のことが可能になります。定数式に基づいてコードを条件付きで評価およびコンパイルします。ただし、この機能は、テンプレート化されていない関数で使用する場合には制限があります。
コード:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; }</code>
問題:
上に示したように、「if constexpr」が非テンプレート関数で使用されている場合、非ポインター値を逆参照しようとするとコンパイル エラーが発生します。このエラーは、テンプレート関数とは異なり、非テンプレート関数の「if constexpr」では、取得されないコード パスのコンパイルが妨げられないために発生します。
説明:
テンプレート関数では、「if constexpr」を使用すると、テンプレート パラメーターの値に基づいてコードを条件付きでコンパイルできます。この場合、コンパイラは、テンプレートが特定の特殊化に対して有効であるかどうかをコンパイル時に判断し、必要なコード パスのみをインスタンス化できます。
ただし、テンプレート化されていない関数では、「if constexpr」は単に実行時の条件文。コンパイラは引き続き条件文の両方の分岐を分析し、選択されなかった分岐のコードが無効な場合は、コンパイル エラーが発生します。
解決策:
このエラーを回避するには、テンプレート関数、またはコンパイル時に型がわかっており、条件文の両方の分岐で有効であることが保証されている非テンプレート関数でのみ、「if constexpr」を使用してください。
以上がC 17 の非テンプレート関数で「if constexpr」によりコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。