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
Libérer: 2024-12-10 18:12:11
original
859 Les gens l'ont consulté

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);
Copier après la connexion
Copier après la connexion
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
Copier après la connexion
  • Exemple 2 (échec de la déduction) :
template<typename T>
void func(typename T::type* arg);
Copier après la connexion
Copier après la connexion
template<>
struct A<char> {};
Copier après la connexion
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.
Copier après la connexion

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!

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