Heim > Backend-Entwicklung > C++ > Erlaubt GCC Nicht-Constexpr-Standardbibliotheksfunktionen in Constexpr-Kontexten?

Erlaubt GCC Nicht-Constexpr-Standardbibliotheksfunktionen in Constexpr-Kontexten?

Barbara Streisand
Freigeben: 2024-11-29 20:03:12
Original
385 Leute haben es durchsucht

Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?

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);
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage