Les fonctions de bibliothèque standard non-Constexpr peuvent-elles être traitées comme Constexpr dans GCC ?
GCC compile du code qui initialise des variables constexpr statiques avec des variables non-constexpr fonctions de bibliothèque standard sans émettre d'avertissements, comme les fonctions de l'exemple ci-dessous :
#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); };
Selon les normes C 11 et C 14, les fonctions non constexpr ne peuvent pas être utilisées dans des expressions constantes. Cependant, GCC traite certaines fonctions de bibliothèque standard intégrées comme constexpr, même si elles ne sont pas explicitement marquées comme telles.
Ce comportement est une extension non conforme en C 14. Le projet de norme C 14 interdit les implémentations de déclarer les signatures de fonctions de bibliothèque standard comme constexpr sauf si cela est explicitement requis.
En C 11, le consensus est passé de l'autorisation de cette extension à son interdiction. En effet, différentes implémentations traitant les fonctions différemment pourraient entraîner une divergence de comportement lors de l'utilisation de SFINAE.
GCC s'est initialement appuyé sur une résolution proposée antérieurement du LWG numéro 2013, qui permettait aux implémentations de déclarer n'importe quelle fonction comme constexpr si elle satisfaisait à certains contraintes. C'est pourquoi GCC traite ces fonctions comme constexpr en mode de conformité stricte.
Cependant, la résolution a changé en C 14, et cette extension est désormais considérée comme non conforme. GCC devrait résoudre ce problème et soit émettre des avertissements, soit désactiver ce comportement en mode de conformité stricte.
Notez que les éléments intrinsèques du compilateur ne sont pas couverts par ce problème, leur utilisation dans des contextes constexpr devrait donc ê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!