Traitement des fonctions de bibliothèque standard non constexpr comme Constexpr : une analyse de conformité
La question se pose de savoir si une extension du compilateur qui traite la norme non constexpr la bibliothèque fonctionne comme constexpr est conforme. Malgré le caractère permissif du projet de norme C 11, qui suggérait qu'un tel traitement pourrait être autorisé, les développements ultérieurs ont clarifié la question.
C 14 Interdiction explicite
Dans C 14 , le projet de section standard 17.6.5.6 indique explicitement que les implémentations ne doivent déclarer aucune signature de fonction de bibliothèque standard comme constexpr, sauf si cela est explicitement requis. Cette décision exclut le traitement conforme des fonctions de bibliothèque standard non constexpr en tant que constexpr.
Extension GCC
GCC a implémenté une extension qui traite certaines fonctions intégrées comme constexpr. . Cependant, cette extension est considérée comme non conforme sur la base de la norme C 14 mise à jour.
Règle d'as-if et comportement observable
Au départ, il n'était pas clair si l'as- si la règle permettait de traiter les fonctions non-constexpr comme constexpr. La règle du « comme si » permet aux implémentations de s'écarter des exigences de la norme tant qu'elles produisent un comportement observable équivalent. Cependant, la modification du statut constexpr des fonctions affecte le comportement observable, comme le démontrent les tests SFINAE, qui se comporteraient différemment en cas d'utilisation d'un code identique.
Atténuation conforme
Pour rendre le Si l'extension GCC est conforme, le compilateur devra émettre des avertissements en mode de conformité stricte (par exemple, -std=c 11 -pedantic) lorsque Les fonctions de bibliothèque standard non constexpr sont utilisées dans les contextes constexpr.
Exception relative aux intrinsèques
Les intrinsèques du compilateur ne sont pas couverts par la norme et peuvent être exemptés de la règle de fonction constexpr. L'utilisation d'intrinsèques intégrés (par exemple, __builtin_cos) comme constexpr pourrait potentiellement être autorisée.
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!