Maison >développement back-end >C++ >Quel est le « contexte immédiat » dans C 11 SFINAE et comment affecte-t-il les échecs de substitution ?

Quel est le « contexte immédiat » dans C 11 SFINAE et comment affecte-t-il les échecs de substitution ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-12 19:10:11968parcourir

What is the

Comprendre le « contexte immédiat » dans C 11 SFINAE

La norme C 11 spécifie les conditions dans lesquelles un échec de substitution entraîne une compilation matérielle erreur ou une erreur logicielle qui supprime simplement un modèle des candidats à la résolution de surcharge. Un concept clé dans cette détermination est le « contexte immédiat ».

Définition du « contexte immédiat »

Le terme « contexte immédiat » est brièvement mentionné dans la norme, mais sa définition exacte n'est pas explicitement fournie. Cependant, on le trouve souvent en conjonction avec le texte suivant :

Note: The evaluation of the substituted types and expressions can result in side effects such as instantiation of template specializations, generation of implicitly-defined functions, etc. Such side effects are not in the “immediate context” and can result in the program being ill-formed.

Cette note indique que les effets secondaires survenant au cours du processus de substitution, tels que les instanciations de modèles ou les définitions de fonctions implicites, ne sont pas considérés comme faisant partie du processus de substitution. contexte immédiat.

Détermination des erreurs de substitution dans le contexte immédiat

Pour déterminer si une erreur de substitution se produit dans le Dans un contexte immédiat, envisagez les étapes suivantes :

  1. Identifiez les effets secondaires : Imaginez instancier tous les modèles et définir toutes les fonctions implicites requises pour la substitution d'arguments de modèle.
  2. Vérifier les erreurs : Si des erreurs surviennent lors de cette étape de "préparation", elles ne font pas partie du contexte immédiat et entraînent une compilation difficile erreurs.
  3. Remplacer les arguments : Une fois que toutes les instanciations et définitions nécessaires ont été générées sans erreur, remplacez les arguments dans la signature du modèle de fonction.
  4. Vérifiez les erreurs. lors de la substitution : Si des erreurs surviennent lors de cette étape finale de substitution, ce ne sont pas de vraies erreurs mais plutôt une déduction échecs.

Exemples

Considérez le modèle et la fonction de secours suivants :

template<typename T>
void func(typename T::type* arg);

template<>
void func(...);
  1. Cas 1 : En supposant que A soit un modèle avec un membre de type, un appel à func::type*>(nullptr) échouera avec une erreur de compilation matérielle car l'instanciation de A (pendant la préparation) crée un pointeur invalide vers une référence.
  2. Cas 2 : Si A a une spécialisation explicite pour char, un appel à func::type*> ;(nullptr) instanciera A (la préparation réussit), mais la substitution ultérieure de A::type (étape finale) échoue car elle n'existe pas. Cela provoque un échec de déduction et la fonction de repli est utilisée.

Conclusion

En comprenant le concept de contexte immédiat, vous pouvez mieux identifier quand une erreur de substitution entraînera une erreur de compilation matérielle ou un échec de déduction douce, permettant l'utilisation efficace de SFINAE en C 11.

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