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

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

DDD
DDDoriginal
2024-12-12 20:17:11177parcourir

What Defines

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 pendant la préparation échoue car les pointeurs vers des références ne sont pas autorisés. Puisque cette erreur se produit avant la substitution, elle entraîne une erreur de compilation matérielle.

  • 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. Lors de la substitution, A::type n'existe pas, mais cette erreur se produit après la phase de préparation et n'entraîne qu'un échec de déduction des arguments et l'utilisation de la fonction de repli.

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