Statische Assertionen in fehlgeschlagenen Consexpr if-Blöcken
Einführung
constexpr, falls in C 17 eingeführt ermöglicht einen prägnanteren und effizienteren Code. Allerdings wirft es auch Fragen bezüglich der Handhabung von static_assert-Anweisungen in diesen if-Blöcken auf.
Fehler statischer Assertionen in nicht genommenen Zweigen
Der Standardtext besagt, dass static_assert Anweisungen sind in nicht verwendeten Zweigen von constexpr if-Anweisungen falsch geformt. Dies gilt unabhängig davon, ob die Bedingung abhängig ist oder nicht.
Grundlegende Regel
Dieses Verbot basiert auf einer etablierten Regel für Vorlagen, die besagt, dass es sich um ein Programm handelt ist ein fehlerhafter NDR (keine Diagnose erforderlich), wenn für eine Vorlage keine gültige Spezialisierung generiert werden kann. Statische_Asserts mit unabhängigen Bedingungen, die als falsch ausgewertet werden, fallen in diese Kategorie.
Auswirkungen auf Sicherheit und Nützlichkeit
Diese Einschränkung schränkt die Sicherheit und Nützlichkeit von constexpr if erheblich ein . Entwickler müssen sich aller potenziellen static_asserts bewusst sein, die innerhalb des nicht genommenen Zweigs der if-Anweisung aufgerufen werden können.
Beispiel
Der folgende Code wird ohne Warnungen kompiliert, ist aber kompiliert gilt als schlecht geformt:
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>(); }
Geltungsbereich der Regel
Das Verbot von static_asserts erstreckt sich auf Aufrufdiagramme, daher ist jede Funktion, die innerhalb des nicht genommenen Zweigs aufgerufen wird und möglicherweise static_asserts enthält, ebenfalls verboten.
Schlussfolgerung
Das Scheitern von static_asserts in nicht verwendeten Zweigen von constexpr if-Anweisungen unterstreicht die Notwendigkeit sorgfältiger Überlegungen bei der Verwendung sie innerhalb von Vorlagen. Entwickler müssen sicherstellen, dass alle static_asserts mit unabhängigen Bedingungen, die als „false“ ausgewertet werden, nicht im nicht genommenen Zweig der if-Anweisung versucht werden.
Das obige ist der detaillierte Inhalt vonWas passiert mit statischen Behauptungen in nicht belegten „constexpr if'-Zweigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!