Maison >développement back-end >C++ >Les compilateurs C 14 peuvent-ils traiter de manière conforme les fonctions de bibliothèque standard non constexpr comme « constexpr » ?

Les compilateurs C 14 peuvent-ils traiter de manière conforme les fonctions de bibliothèque standard non constexpr comme « constexpr » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-05 22:35:13230parcourir

Can C  14 Compilers Conformingly Treat Non-constexpr Standard Library Functions as `constexpr`?

Extension du compilateur conforme pour constexpr Gestion des fonctions de bibliothèque standard non constexpr ?

En C 11, le projet de norme semblait permettre de traiter la norme la bibliothèque fonctionne comme constexpr même si elle n'a pas été explicitement marquée comme telle. Cependant, cette position a évolué depuis.

C 14 Evolution

En C 14, il est explicitement indiqué que les fonctions requises non standard ne doivent pas être déclarées comme constexpr par mises en œuvre. Ceci est décrit dans la section 17.6.5.6 du projet de norme C 14 :

An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.

Cette décision a été prise pour éviter les divergences de mise en œuvre, en particulier avec l'utilisation de SFINAE conduisant à des comportements observables différents.

Implémentation de GCC

GCC traitait auparavant certaines fonctions de bibliothèque standard non constexpr comme constexpr basées sur la résolution précédente de la proposition du LWG 2013. Cependant, ce comportement n'est plus considéré comme conforme en C 14.

Absence d'avertissement en mode strict

Malgré la non-conformité, GCC ne génère pas d'avertissements en mode de conformité stricte ( -std=c 11 -pédant). Il s'agit probablement d'un oubli qui sera corrigé dans les futures mises à jour.

Exemption des intrinsèques

Les intrinsèques du compilateur ne sont pas soumis à la même règle que les fonctions de bibliothèque standard. Par conséquent, l'utilisation d'intrinsèques telles que :

static constexpr double a = __builtin_cos(3.);

doit être considérée comme conforme.

Conclusion

Traiter les fonctions de bibliothèque standard non constexpr comme constexpr est actuellement une extension non conforme dans C 14. Bien que GCC ait autorisé cela dans C 11 sur la base d'une résolution de proposition antérieure, il est attendu que cette extension sera supprimée ou modifiée pour se conformer à la norme C 14 actuelle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn