Maison >développement back-end >C++ >Qu'est-ce qui définit le « contexte immédiat » dans C 11 SFINAE ?
Contexte immédiat en C 11 SFINAE
La norme C 11 définit SFINAE (Substitution Failure Is Not An Error) comme une technique d'activation conditionnelle ou désactiver le code basé sur la déduction des arguments du modèle. La section 14.8.2/8 décrit les conditions pour qu'un échec de substitution entraîne une erreur de compilation « matérielle » ou une erreur « logicielle » conduisant à SFINAE.
La norme fait référence à un « contexte immédiat » dans cette section , indiquant que 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 provoquer un échec de déduction. Cependant, la définition du « contexte immédiat » n'est pas explicite.
Procédure de décision pour le contexte immédiat
Pour déterminer si une erreur de substitution se produit dans le contexte immédiat, considérez le suivant :
Imaginez que tous les modèles et les fonctions implicitement définies requises pour la substitution des arguments de modèle soient générés au préalable. Toute erreur survenant au cours de cette préparation n'est pas dans le contexte immédiat et entraînera des erreurs de compilation matérielles.
Si l'étape de préparation se termine avec succès, toute erreur ultérieure lors de la substitution (par exemple, faisant référence à des modèles instanciés ou à des fonctions implicitement définies dans la signature du modèle de fonction) ne constituent pas des erreurs mais donnent lieu à une déduction échecs.
Exemples
Exemple 1 :
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; func<A<int&>>(...);
Dans cet exemple, instancier A
Exemple 2 :
template<typename T> void func(typename T::type* arg); template<typename> void func(...); template<typename T> struct A { typedef T* type; }; template<> struct A<char> {}; func<A<char>>(...);
Dans cet exemple, le l'étape de préparation instancie avec succès A
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!