Heim > Backend-Entwicklung > C++ > Was passiert mit statischen Behauptungen in nicht belegten „constexpr if'-Zweigen?

Was passiert mit statischen Behauptungen in nicht belegten „constexpr if'-Zweigen?

DDD
Freigeben: 2024-11-27 14:50:14
Original
741 Leute haben es durchsucht

What Happens to Static Assertions in Untaken `constexpr if` Branches?

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>(); 
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage