Maison >développement back-end >C++ >Qu'est-ce qui détermine si une erreur de substitution de modèle C 11 est une erreur matérielle ou logicielle ?

Qu'est-ce qui détermine si une erreur de substitution de modèle C 11 est une erreur matérielle ou logicielle ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 19:03:11346parcourir

What Determines Whether a C  11 Template Substitution Error Is a Hard or Soft Error?

Contexte immédiat dans la substitution de modèle C 11

La norme C 11 introduit l'échec de la substitution n'est pas une erreur (SFINAE), qui permet le suppression des erreurs de compilation matérielle lors de la substitution d'arguments de modèle. Cependant, la norme définit un « contexte immédiat » spécifique pour lequel SFINAE s'applique, laissant une certaine incertitude quant au moment où une erreur de substitution entraîne une erreur matérielle ou logicielle.

Définition du contexte immédiat

La norme définit le contexte immédiat comme :

"Seuls les types et expressions non valides dans le contexte immédiat du type de fonction et de ses types de paramètres de modèle peuvent entraîner un échec de déduction. . De tels effets secondaires ne sont pas dans le « contexte immédiat » et peuvent entraîner une mauvaise formation du programme."

Décision. Procédure

Pour déterminer si une erreur de substitution se produit dans le contexte immédiat, considérez la procédure de décision suivante :

Étape 1 :

Identifiez tous les modèles et fonctions implicitement définies nécessaires pour déterminer le résultat de la substitution.
  • Étape 2 : Imaginez ces entités sont générés avant le début de la substitution.
  • Étape 3 : Si des erreurs se produisent au cours de cette génération hypothétique, elles ne sont pas dans le contexte immédiat et entraîneront des erreurs matérielles.
  • Étape 4 : Si toutes les entités sont générées sans erreur, toutes les erreurs ultérieures lors de la substitution ne sont pas des erreurs mais entraînent une déduction d'arguments échecs.
  • Exemples

Erreur matérielle :

func> - Instanciation de A échoue car les pointeurs vers des références ne sont pas autorisés.
  • Échec de la déduction d'argument : func> - Instanciation de A réussit, mais A::type n'existe pas.
  • Échec de la déduction d'argument : class B { void f(int); } ; func::f - La définition implicite de f produit une fonction membre supprimée.
  • Conclusion

En comprenant le concept de contexte immédiat et en utilisant le ci-dessus, les programmeurs peuvent mieux prédire quand les erreurs de substitution entraîneront des erreurs matérielles ou logicielles, permettant une utilisation plus efficace de SFINAE en C 11. modèles.

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