Maison >développement back-end >C++ >Pourquoi les valeurs à virgule flottante ne peuvent-elles pas être utilisées comme paramètres de modèle C ?
Lorsque vous tentez d'instancier un modèle de classe générique avec une valeur flottante comme paramètre par défaut, le compilateur peut émettre des erreurs. Bien que les valeurs entières fonctionnent comme prévu, les flottants ne le font pas.
Selon la norme C 11 (14.3.2/1), les arguments de modèle non-type pour les arguments non Les paramètres du modèle -type doivent respecter des règles spécifiques. Une restriction est qu’il ne peut pas s’agir de valeurs à virgule flottante. Au lieu de cela, ils doivent être de type intégral ou énumération, d'expressions constantes converties d'un type de paramètre de modèle ou d'autres constructions spécifiques.
Cette limitation provient probablement de la caractère imprécis des calculs en virgule flottante. Représenter exactement les valeurs à virgule flottante n'est pas toujours réalisable, ce qui entraîne des inexactitudes potentielles susceptibles de provoquer un comportement inattendu. Prenons l'exemple suivant :
func<1/3.f>(); func<2/6.f>();
Bien que destinées à appeler la même fonction deux fois, les représentations en virgule flottante de 1/3 et 2/6 ne sont pas garanties d'être identiques en raison d'erreurs d'arrondi potentielles. Cela pourrait conduire à des invocations de fonctions involontaires.
Si l'objectif est de représenter des valeurs à virgule flottante d'une manière ou d'une autre en tant qu'arguments de modèle, une option consiste à utiliser des expressions constantes C 11 (constexpr) . Ceux-ci permettent de calculer le numérateur et le dénominateur d'une valeur à virgule flottante au moment de la compilation, qui peuvent ensuite être transmis sous forme d'arguments entiers distincts.
Cependant, il est crucial de définir un seuil pour garantir que les valeurs à virgule flottante proches les unes des autres. d’autres partagent la même paire numérateur/dénominateur. Sinon, la justification de la restriction des valeurs à virgule flottante en tant qu'arguments de modèle non-type reste valable.
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!