C 11 führte den Constexpr-Spezifizierer ein, der die Verwendung von Funktionen in konstanten Ausdrücken ermöglicht. Obwohl es strenge Anforderungen an das Funktionsverhalten stellt, stellt es einen entscheidenden Vorteil dar.
Stellen Sie sich ein Szenario vor, in dem eine Bibliotheksfunktion zunächst eine Konstante zurückgibt, wie dargestellt in awesome_lib.hpp:
inline int f() { return 4; }
Ohne constexpr könnte Clientcode diese Funktion für Zwecke verwenden, die Konstanten zur Kompilierungszeit erfordern, wie z. B. Vorlagenargumente oder Array-Dimensionen.
#include#include std::array ; // needs CT template arg int my_c_array[f()]; // needs CT array dimension
Wenn sich jedoch die Implementierung von f() ändern würde, um seinen Wert aus einer Konfigurationsdatei abzurufen, würde dieser Client-Code kaputt gehen. Diese Änderung würde die Nutzung der Schnittstelle ohne Wissen des Client-Codierers effektiv verändern.
Indem der Programmierer die Funktion als constexpr markiert, erkennt er an, dass der Client-Code vernünftigerweise mit seiner konstanten Natur rechnen kann. Dadurch wird sichergestellt, dass die Nutzung der Bibliotheksfunktion nicht durch Implementierungsänderungen beeinträchtigt wird. Der Compiler erzwingt diese Erwartung und garantiert, dass der Clientcode nicht von nicht konstanten Funktionen abhängt.
Ähnlich dem Const-Spezifizierer für Bei Mitgliedsfunktionen verhindert der constexpr-Spezifizierer, dass Clientcode auf Funktionen angewiesen ist, die in Zukunft möglicherweise nicht mehr verfügbar sein werden. Sie unterscheiden sich jedoch in ihren Durchsetzungsmechanismen.
Der const-Spezifizierer stellt sicher, dass andere Mitgliedsfunktionen innerhalb einer konstanten Mitgliedsfunktion ebenfalls konstant sind, wohingegen constexpr nicht für alle seine Verwendungen konstante Ergebnisse zur Kompilierungszeit erzwingt. Diese Flexibilität ermöglicht Hybridfunktionen, die nach Möglichkeit Ergebnisse zur Kompilierungszeit zurückgeben können, in Nicht-Constexpr-Kontexten jedoch auf Laufzeitberechnungen zurückgreifen.
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