if constexpr verhält sich in nicht auf Vorlagen basierenden Funktionen in C 17 nicht wie erwartet
In C 17 ermöglicht die if constexpr-Anweisung eine Bedingung Kompilierung basierend auf konstanten Ausdrücken zur Kompilierungszeit. Wenn Sie jedoch versuchen, diese Funktion in einer Funktion ohne Vorlage zu verwenden, können unerwartete Kompilierungsfehler auftreten.
Beachten Sie den folgenden Codeausschnitt:
<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; }</code>
Beim Kompilieren dieses Codes tritt ein Fehler auf treten in der Zeile auf und versuchen, „value“ innerhalb der if constexpr-Anweisung zu dereferenzieren. Dies liegt daran, dass constexpr in Funktionen ohne Vorlagen nicht unterstützt wird.
Warum nur Vorlagen?
Dieses Verhalten ist beabsichtigt. wenn constexpr die Instanziierung von ungültigem Vorlagencode basierend auf bestimmten Spezialisierungen verhindern soll. Im bereitgestellten Beispiel prüft die Funktion ohne Vorlage mithilfe von std::is_pointer_v
Lösung
Zu verwenden if constexpr in nicht- Bei Kontexten mit Vorlagen sollten Sie erwägen, den Code in eine Vorlagenfunktion einzuschließen oder ein Makro zu verwenden, das sich zur Kompilierzeit anders verhält. Zum Beispiel:
<code class="cpp">#include <iostream> #include <type_traits> template<typename T> void print(T value) { if constexpr (std::is_pointer_v<T>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { auto n = 1000; print(n); int *ptr = &n; print(ptr); }</code>
In diesem Fall ist die Druckfunktion eine Vorlage, d. h. wenn das constexpr-Verhalten basierend auf dem Vorlagenparameter korrekt angewendet wird.
Das obige ist der detaillierte Inhalt vonWarum funktioniert „if constexpr' nicht in nicht auf Vorlagen basierenden Funktionen in C 17?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!