Heim >Backend-Entwicklung >C++ >Entspricht die Behandlung von Nicht-constexpr-Standardbibliotheksfunktionen als „constexpr' dem C-Standard?

Entspricht die Behandlung von Nicht-constexpr-Standardbibliotheksfunktionen als „constexpr' dem C-Standard?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 19:32:14272Durchsuche

Is Treating Non-constexpr Standard Library Functions as `constexpr` Conforming to the C   Standard?

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!

Stellungnahme:
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