Heim > Artikel > Backend-Entwicklung > Warum verursacht „if constexpr“ Kompilierungsfehler in nicht auf Vorlagen basierenden Funktionen in C 17?
Fehler bei der Verwendung von „If constexpr“ in nicht auf Vorlagen basierenden Funktionen in C 17
In C 17 ermöglicht die „if constexpr“-Anweisung Folgendes Bedingtes Auswerten und Kompilieren von Code basierend auf konstanten Ausdrücken. Diese Funktion weist jedoch eine Einschränkung auf, wenn sie in nicht auf Vorlagen basierenden Funktionen verwendet wird.
Code:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; }</code>
Problem:
Wenn „if constexpr“ wie oben gezeigt in einer Funktion ohne Vorlage verwendet wird, tritt beim Versuch, einen Nicht-Zeiger zu dereferenzieren, ein Kompilierungsfehler auf Wert. Dieser Fehler tritt auf, weil „if constexpr“ in Funktionen ohne Vorlagen im Gegensatz zu Funktionen mit Vorlagen nicht die Kompilierung von Codepfaden verhindert, die nicht verwendet werden.
Erklärung:
In Vorlagenfunktionen ermöglicht „if constexpr“ die bedingte Kompilierung von Code basierend auf dem Wert der Vorlagenparameter. In diesem Fall kann der Compiler zum Zeitpunkt der Kompilierung feststellen, ob die Vorlage für eine bestimmte Spezialisierung gültig ist, und nur den erforderlichen Codepfad instanziieren.
In Funktionen ohne Vorlage fungiert „if constexpr“ jedoch nur als bedingte Anweisung zur Laufzeit. Der Compiler analysiert weiterhin beide Zweige der bedingten Anweisung, und wenn Code im nicht verwendeten Zweig ungültig ist, tritt ein Kompilierungsfehler auf.
Lösung:
Um diesen Fehler zu vermeiden, verwenden Sie „if constexpr“ nur in Funktionen mit Vorlagen oder in Funktionen ohne Vorlagen, bei denen der Typ zur Kompilierungszeit bekannt ist und garantiert für beide Zweige der Bedingung gültig ist Aussage.
Das obige ist der detaillierte Inhalt vonWarum verursacht „if constexpr“ Kompilierungsfehler in nicht auf Vorlagen basierenden Funktionen in C 17?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!