Maison >développement back-end >C++ >Qu'est-ce qui constitue le « contexte immédiat » dans C 11 SFINAE ?

Qu'est-ce qui constitue le « contexte immédiat » dans C 11 SFINAE ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 18:12:11799parcourir

What Constitutes the

Quel est exactement le « contexte immédiat » dans C 11 SFINAE ?

Le concept de « contexte immédiat » est crucial dans la substitution de C 11 L'échec n'est pas une erreur (SFINAE). Selon la norme C 11, 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.

Compréhension initiale

La norme fournit une indication limitée dans une note : "l'évaluation des types et expressions substitués peut entraîner des effets secondaires tels que des spécialisations de modèles de classe, des spécialisations de modèles de fonctions, une génération de fonctions implicites, etc." Ces effets secondaires ne sont pas considérés comme faisant partie du « contexte immédiat ».

Procédure de décision

Pour déterminer si une erreur de substitution se produit dans le « contexte immédiat », suivez ceci procédure :

  1. Identifier les modèles et les fonctions nécessaires : Considérez tous les modèles et fonctions implicitement définies requises pour la substitution d'arguments.
  2. Étape de pré-instanciation : Imaginez générer ces modèles et fonctions avant la substitution.
  3. Erreurs directes : Si des erreurs surviennent lors de cette étape de pré-instanciation, elles ne se trouvent pas dans le contexte immédiat et entraînent une compilation matérielle. erreurs.
  4. Échec de déduction : Si la pré-instanciation réussit, toutes les erreurs ultérieures lors de la substitution ne sont pas des erreurs mais entraînent des échecs de déduction.

Béton Exemples

  • Exemple 1 (dur Erreur) :
template<typename T>
void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
  • Exemple 2 (échec de la déduction) :
template<typename T>
void func(typename T::type* arg);
template<>
struct A<char> {};
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.

Conclusion

Le « immédiat context" fait référence à des expressions et des types qui peuvent être résolus sans nécessiter de génération de modèle ou de fonction supplémentaire au-delà de l'étape de pré-instanciation nécessaire. Les erreurs survenant lors de cette étape de pré-instanciation entraînent des erreurs de compilation matérielles, tandis que les erreurs lors de l'étape de substitution suivante provoquent des échecs de déduction.

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