Maison >développement back-end >C++ >Qu'est-ce qui constitue le « contexte immédiat » dans C 11 SFINAE ?
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 :
Béton Exemples
template<typename T> void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
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!