Wie wirkt sich ein fehlgeschlagener static_assert auf einen if constexpr-Block (false) aus?
Ein static_assert innerhalb eines nicht genommenen Zweigs eines if constexpr Die Aussage gilt als fehlerhaft und erfordert keine Diagnose. Diese Konsequenz ergibt sich aus der Regel in [temp.res]/8, die ein Programm als fehlerhaft ansieht, wenn keine gültige Spezialisierung für eine Vorlage oder eine Unteranweisung innerhalb einer constexpr if-Anweisung generiert werden kann.
In diesem Fall Wenn die Bedingung von static_assert nicht abhängig ist und als falsch ausgewertet wird, kann keine gültige Spezialisierung für die Vorlage generiert werden, die die Behauptung enthält. Dies macht das Programm fehlerhaft, auch wenn die Verzweigung nicht genommen wird.
Statische_asserts mit einer abhängigen Bedingung bleiben jedoch davon unberührt. Wenn die Bedingung für mindestens einen Typ als wahr ausgewertet werden kann, bleibt die Vorlage gültig.
Beispiel
Bedenken Sie den folgenden Code:
template< typename T>< constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); } int main(){ g<float>(); g<int>(); }
Obwohl die if constexpr-Bedingung falsch ist, ist der Code immer noch falsch formatiert, da static_assert in other_library_foo ein nichtabhängiges enthält Bedingung, die als falsch ausgewertet wird.
Das obige ist der detaillierte Inhalt vonWie wirkt sich ein fehlgeschlagener „static_assert' in einem nicht ausgeführten „if constexpr'-Block auf die Programmgültigkeit aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!