C 17s „if constexpr“ auf Vorlagenfunktionen beschränkt
In C 17 hat die Einführung von „if constexpr“ Interesse daran geweckt Fähigkeit, Code basierend auf Konstanten zur Kompilierungszeit bedingt auszuführen. Es tritt jedoch ein Problem auf, wenn versucht wird, es in nicht auf Vorlagen basierenden Funktionen zu verwenden.
Bedenken Sie den folgenden Code:
#include
#include
void print(auto value)
{
// Compile-time check if value is a pointer
if constexpr (std::is_pointer_v)
std::cout Während dieser Code in auf Vorlagen basierenden Funktionen fehlerfrei kompiliert wird, schlägt er mit einem Kompilierungsfehler fehl, wenn er in einer nicht auf Vorlagen basierenden Funktion wie print platziert wird. Der Grund liegt im Verhalten von „if constexpr.“
„if constexpr“ ist so konzipiert, dass es eine bedingte Kompilierung von Vorlagencode ermöglicht. In einer Vorlagenfunktion leitet der Compiler zur Kompilierungszeit den Typ des Parameters ab und ermöglicht so die Auswahl des geeigneten Codepfads basierend auf dem Typ. In diesem Fall kann die Druckfunktion bei Vorlage einer Vorlage erkennen, ob der Wert zur Kompilierungszeit ein Zeiger ist, und den entsprechenden Codezweig ausführen.
In einer Funktion ohne Vorlage ist jedoch der Typ des Werts bekannt nur zur Laufzeit, wodurch „if constexpr“ unwirksam wird. Der Compiler behandelt beide Zweige der Bedingung als ausführbaren Code, was zu einem Kompilierungsfehler führt, wenn versucht wird, den Wert im Ptr zu dereferenzieren, um zu verzweigen, wenn der Wert eine Ganzzahl ist.
Um dieses Problem zu vermeiden, muss „ if constexpr" innerhalb einer Vorlagenfunktion oder stellen Sie der nicht vorlagenbasierten Funktion explizite Typinformationen zur Verfügung, um die Typableitung zur Kompilierungszeit sicherzustellen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3