Heim >Backend-Entwicklung >C++ >Wie kann ich sicherstellen, dass in einer C-„constexpr if-else'-Kette niemals eine „else'-Klausel ausgeführt wird?
Verhindern der Nichterfüllung von Constexpr-If-Else-Klauseln
In C kann es vorkommen, dass man behaupten muss, dass alle constexpr-If-Bedingungen darin enthalten sind eine if-else-Anweisung erfüllt sind. Ohne eine solche Behauptung kann die else-Klausel unerwartet verwendet werden.
Beachten Sie den folgenden Code:
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); }
Man könnte annehmen, dass die else-Klausel niemals verwendet werden würde, da alle Bedingungen wechselseitig sein sollten exklusiv. Nach dem C-Standard ist eine solche Behauptung jedoch nicht zulässig.
Lösung: Template-Abhängigkeit
Um zu verhindern, dass die else-Klausel übernommen wird, muss man das machen Die verworfene Anweisung hängt von den Vorlagenparametern ab. Dies kann mit dem folgenden Code erreicht werden:
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
Der C-Standard besagt, dass ein Programm fehlerhaft ist, wenn keine gültige Spezialisierung generiert werden kann eine Vorlage oder eine Unteranweisung innerhalb einer Vorlage. Indem der Compiler die verworfene Anweisung von Vorlagenparametern abhängig macht, kann er sicherstellen, dass keine gültige Spezialisierung generiert werden kann, wenn keine der Bedingungen erfüllt ist, wodurch effektiv verhindert wird, dass die else-Klausel verwendet wird.
Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass in einer C-„constexpr if-else'-Kette niemals eine „else'-Klausel ausgeführt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!