Maison > développement back-end > C++ > GCC autorise-t-il les fonctions de bibliothèque standard non Constexpr dans les contextes Constexpr ?

GCC autorise-t-il les fonctions de bibliothèque standard non Constexpr dans les contextes Constexpr ?

Barbara Streisand
Libérer: 2024-11-29 20:03:12
original
337 Les gens l'ont consulté

Does GCC Allow Non-Constexpr Standard Library Functions in Constexpr Contexts?

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);
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal