Heim > Artikel > Backend-Entwicklung > Warum funktioniert „if constexpr“ in nicht auf Vorlagen basierenden C-Funktionen nicht wie erwartet?
if constexpr in C 17 funktioniert nicht in Funktionen ohne Vorlage
Einführung
Die Der C 17-Standard führte das if constexpr-Konstrukt ein, das eine bedingte Ausführung basierend auf konstanten Ausdrücken ermöglicht. Es wurde jedoch beobachtet, dass sich das Verhalten von constexpr unterscheidet, wenn es in vorlagenbasierten und nicht vorlagenbasierten Funktionen verwendet wird.
Problem
Betrachten Sie die folgende nicht vorlagenbasierte Funktion:
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
Dieser Code führt zu einem Kompilierungsfehler, da *value für den abgeleiteten Typ int ungültig ist.
Antwort
Dieses Verhalten ist beabsichtigt. Wenn constexpr in Vorlagenfunktionen die Instanziierung von Zweigen vermeiden kann, die für bestimmte Vorlagenspezialisierungen nicht gültig sind. Bei Funktionen ohne Vorlage unterdrückt if constexpr jedoch nicht die Kompilierung des nicht genommenen Zweigs.
Beide Zweige der if constexpr-Anweisung werden analysiert und analysiert, auch wenn der nicht genommene Zweig ungültig ist. Daher versucht der Compiler im obigen Code, *value für einen int-Typ auszuwerten, was zu einem Fehler führt.
Schlussfolgerung
Diese Unterscheidung ist wichtig zu verstehen bei Verwendung von if constexpr. In Funktionen ohne Vorlage sollte es nur zur Überprüfung konstanter Ausdrücke verwendet werden, deren Gültigkeit für alle möglichen Werte der Eingabeparameter garantiert ist.
Das obige ist der detaillierte Inhalt vonWarum funktioniert „if constexpr“ in nicht auf Vorlagen basierenden C-Funktionen nicht wie erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!