Constexpr if-else 節の不出現のアサート
C では、すべての constexpr if ステートメントに少なくとも一つの本当の枝。どの条件も満たされない場合、予期しない動作を防ぐためにコンパイル時エラーが発生することが望まれます。
よくある誤解の 1 つは、else 句内で static_assert(false) を使用することです。ただし、このアプローチはコンパイラでは受け入れられません。
この問題に対処する解決策は、破棄されるステートメントをテンプレート パラメーターに依存させることです。 constexpr std::false_type クラスを導入し、テンプレート パラメーター T で特殊化することにより、常に false と評価される条件を作成できます。
例を次に示します。
template <class... T> constexpr std::false_type always_false{}; if constexpr (condition1) { ... } else if constexpr (condition2) { ... } else if constexpr (condition3) { ... } else { // Always false condition static_assert(always_false<T>); }
によるとC 標準のセクション [temp.res]/8 (テンプレートまたは constexpr if ステートメントのサブステートメントに対して有効な特殊化を生成できない場合)テンプレートである場合、プログラムは不正な形式であるとみなされます。これにより、else 句が決して使用されず、コンパイル時エラーが発生することが効果的に保証されます。
以上がC Constexpr if-else ステートメントで未処理のケースのコンパイル時エラーを保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。