Fehlgeschlagenes Static_Assert-Verhalten in Consexpr If (False)-Blöcken
Die Einführung von constexpr if in C 17 hat Bedenken hinsichtlich des Verhaltens von static_asserts aufgeworfen innerhalb des nicht belegten Zweigs davon Anweisungen.
Gemäß dem C-Standard werden verworfene Anweisungen innerhalb des nicht genommenen Zweigs nicht instanziiert, wenn eine constexpr if-Anweisung in einer Vorlagenentität erscheint. Diese Regel verbietet die Ausführung von static_asserts mit unabhängigen falschen Bedingungen während der Vorlageninstanziierung, wodurch das Programm effektiv als fehlerhaft eingestuft wird.
Dieses Verhalten ergibt sich aus einer allgemeineren Regel, die für alle Vorlagen gilt: wenn keine gültige Spezialisierung generiert werden kann Wenn für eine Vorlage mit einer Unteranweisung in einem constexpr die Auswertung „false“ ergibt, gilt das Programm als fehlerhaft, unabhängig davon, ob die Vorlage dies ist instanziiert.
Zum Beispiel ist der folgende Code falsch formatiert, obwohl er ohne Warnung mit neueren Versionen von Clang kompiliert wird:
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>(); }
Dieses Verhalten erstreckt sich auf indirekte Aufrufe von static_asserts. Wenn eine constexpr-(Vorlagen-)Funktion ein static_assert mit einer unabhängigen False-Bedingung enthält, kann sie nicht innerhalb des nicht genommenen Zweigs einer constexpr if-Anweisung aufgerufen werden, auch nicht innerhalb einer separaten Vorlage.
Implikationen und Vorsichtsmaßnahmen
Diese Einschränkung für static_asserts innerhalb von constexpr if (false) Blöcken kann sich auf die Sicherheit und Nützlichkeit auswirken von constexpr als Ersatz für SFINAE. Entwickler müssen sich der möglichen Verwendung von static_asserts in Funktionen oder Bibliotheken bewusst sein, die indirekt innerhalb des nicht genommenen Zweigs solcher Anweisungen aufgerufen werden können.
Aus diesem Grund ist es ratsam, die Verwendung von static_asserts in Code zu vermeiden, der möglicherweise verwendet wird als Teil eines constexpr if (false)-Blocks ausgeführt werden. Diese Vorgehensweise stellt sicher, dass Programme wohlgeformt bleiben und vermeidet potenzielle Compiler-Warnungen oder -Fehler.
Das obige ist der detaillierte Inhalt vonWarum schlagen statische Behauptungen in den „constexpr if (false)'-Blöcken von C 17 fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!