Heim >Backend-Entwicklung >C++ >Erlaubt GCC Nicht-Constexpr-Standardbibliotheksfunktionen in Constexpr-Kontexten?
Können Nicht-Constexpr-Standardbibliotheksfunktionen in GCC als Constexpr behandelt werden?
GCC kompiliert Code, der statische Constexpr-Variablen mit Nicht-Constexpr initialisiert Standardbibliotheksfunktionen ohne Ausgabe von Warnungen, wie die Funktionen im Beispiel unten:
#include <cmath> struct foo { static constexpr double a = std::cos(3.); static constexpr double c = std::exp(3.); static constexpr double d = std::log(3.); static constexpr double e1 = std::asin(1.); static constexpr double h = std::sqrt(.1); static constexpr double p = std::pow(1.3,-0.75); };
Gemäß den Standards C 11 und C 14 können Nicht-constexpr-Funktionen nicht in konstanten Ausdrücken verwendet werden. Allerdings behandelt GCC einige integrierte Standardbibliotheksfunktionen als constexpr, auch wenn sie nicht explizit als solche gekennzeichnet sind.
Dieses Verhalten ist eine nicht konforme Erweiterung in C 14. Der Entwurf des C 14-Standards verbietet Implementierungen von Deklarieren von Standardbibliotheksfunktionssignaturen als constexpr, sofern nicht ausdrücklich erforderlich.
In C 11 verlagerte sich der Konsens vom Zulassen dieser Erweiterung zum Verbot. Dies liegt daran, dass unterschiedliche Implementierungen, die Funktionen unterschiedlich behandeln, zu unterschiedlichem Verhalten bei der Verwendung von SFINAE führen können.
GCC stützte sich zunächst auf eine frühere vorgeschlagene Lösung des LWG-Problems 2013, die es Implementierungen ermöglichte, jede Funktion als constexpr zu deklarieren, wenn sie bestimmte Anforderungen erfüllte Einschränkungen. Aus diesem Grund behandelt GCC diese Funktionen im strikten Konformitätsmodus als constexpr.
Allerdings hat sich die Auflösung in C 14 geändert und diese Erweiterung gilt nun als nicht konform. Es wird erwartet, dass GCC dieses Problem behebt und entweder Warnungen ausgibt oder dieses Verhalten im strikten Konformitätsmodus deaktiviert.
Beachten Sie, dass Compiler-Intrinsiken von diesem Problem nicht abgedeckt werden, sodass ihre Verwendung in constexpr-Kontexten zulässig sein sollte.
Das obige ist der detaillierte Inhalt vonErlaubt GCC Nicht-Constexpr-Standardbibliotheksfunktionen in Constexpr-Kontexten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!