Einführung
C 17 führte den if constexpr ein Schlüsselwort, das eine bedingte Kompilierung basierend auf Konstanten zur Kompilierungszeit ermöglicht. Bei der Verwendung von if constexpr in Funktionen ohne Vorlage können jedoch unerwartete Fehler auftreten. In diesem Artikel werden diese Probleme untersucht und eine Lösung bereitgestellt.
Codebeispiel
Betrachten Sie den folgenden Code:
<code class="cpp">#include <iostream> #include <type_traits> int main() { 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; }
Kompilierungsfehler
Dieser Code generiert einen Kompilierungsfehler, wenn sich die if constexpr-Anweisung innerhalb der Hauptanweisung befindet Funktion:
main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’) std::cout << "Ptr to " << *value << std::endl;
Erklärung
Wenn constexpr nur in Vorlagenfunktionen funktioniert, weil es dem Compiler ermöglicht, die Instanziierung von Zweigen zu vermeiden, die zur Kompilierungszeit nicht genommen werden. Diese Optimierung ist für eine effiziente Template-Metaprogrammierung unerlässlich.
In Funktionen ohne Templates wertet constexpr weiterhin beide Zweige aus, auch wenn der Typ durch decltype abgeleitet wird. Dies bedeutet, dass der Fehler im obigen Code durch den Versuch verursacht wird, einen int-Wert im if-Zweig zu dereferenzieren.
Lösung
Um dieses Problem zu beheben, können Sie Folgendes tun Verschieben Sie die if constexpr-Anweisung in eine Vorlagenfunktion. Zum Beispiel:
<code class="cpp">template <typename T> void print(T value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { auto value = 100; print(value); }</code>
Dieser geänderte Code kompiliert und druckt die erwartete Ausgabe:
Ref to 100
Das obige ist der detaillierte Inhalt vonWarum verursacht „if constexpr' Fehler in Funktionen ohne Vorlage in C 17?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!