Behandeln von nicht-constexpr-Standardbibliotheksfunktionen als Consexpr: Eine Konformitätsanalyse
Es stellt sich die Frage, ob eine Compiler-Erweiterung, die nicht-constexpr-Standardfunktionen behandelt Die Bibliothek funktioniert, da constexpr konform ist. Trotz der Freizügigkeit des C 11-Standardentwurfs, der darauf hinwies, dass eine solche Behandlung zulässig sein könnte, haben spätere Entwicklungen die Angelegenheit geklärt.
C 14 Explizites Verbot
In C 14 In Abschnitt 17.6.5.6 des Standardentwurfs heißt es ausdrücklich, dass Implementierungen keine Standardbibliotheksfunktionssignatur als constexpr deklarieren dürfen, es sei denn, dies ist ausdrücklich erforderlich. Diese Regelung schließt die konforme Behandlung von nicht-constexpr-Standardbibliotheksfunktionen als constexpr aus.
GCC-Erweiterung
GCC hat eine Erweiterung implementiert, die bestimmte integrierte Funktionen als constexpr behandelt . Allerdings gilt diese Erweiterung auf Basis des aktualisierten C 14-Standards als nicht konform.
Als-ob-Regel und beobachtbares Verhalten
Es war zunächst unklar, ob das Wenn die Regel es erlaubt, Nicht-Constexpr-Funktionen als Constexpr zu behandeln. Die Als-ob-Regel erlaubt es Implementierungen, von den Anforderungen des Standards abzuweichen, solange sie ein gleichwertiges beobachtbares Verhalten erzeugen. Das Ändern des constexpr-Status von Funktionen wirkt sich jedoch auf das beobachtbare Verhalten aus, wie SFINAE-Tests zeigen, das sich bei Verwendung identischen Codes anders verhalten würde.
Konforme Mitigation
Um das zu erreichen GCC-Erweiterungskonformität, der Compiler müsste Warnungen im strikten Konformitätsmodus ausgeben (z. B. -std=c 11 -pedantic), wenn Nicht-constexpr-Standardbibliotheksfunktionen werden in constexpr-Kontexten verwendet.
Intrinsics-Ausnahme
Compiler-intrinsische Funktionen werden nicht durch den Standard abgedeckt und können von der constexpr-Funktionsregel ausgenommen sein. Die Verwendung integrierter intrinsischer Elemente (z. B. __builtin_cos) als constexpr könnte möglicherweise zulässig sein.
Das obige ist der detaillierte Inhalt vonEntspricht die Behandlung von Nicht-constexpr-Standardbibliotheksfunktionen als „constexpr' dem C-Standard?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!