Constexpr If-Else 節の不履行の防止
C では、すべての constexpr if 条件をアサートする必要がある場合があります。 if-else ステートメントが満たされる。このようなアサーションがないと、else 節が予期せず取られる可能性があります。
次のコードを考えてみましょう。
if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { // I want the else clause never taken. But I heard the code below is not allowed static_assert(false); }
すべての条件が相互に一致する必要があるため、else 節は決して取られないと考えるかもしれません。エクスクルーシブ。ただし、C 標準によれば、そのようなアサーションは許可されていません。
解決策: テンプレートの依存関係
else 句が使用されないようにするには、テンプレートパラメータに応じて破棄されるステートメント。これは、次のコードを使用して実現できます。
template <class... T> constexpr std::false_type always_false{}; if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { static_assert(always_false<T>); }
Reasoning
C 標準では、有効な特殊化を生成できない場合、プログラムは不正形式であると規定されています。テンプレートまたはテンプレート内のサブステートメント。破棄されるステートメントをテンプレート パラメーターに依存させることで、コンパイラーは、どの条件も満たされない場合には有効な特殊化が生成されないようにすることができ、事実上、else 節の取得を防ぐことができます。
以上がC の「constexpr if-else」チェーンで「else」節が実行されないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。