2017-08-28 2 views
1

J'apprenais des idiomes C++ quand je suis tombé sur un exemple de code pour SFINAE, j'étais perplexe avec le code.Comment est la fonction de classe sans définition ne causant pas d'erreur

Remarque: is_ptr() n'a aucune définition.

  1. J'ai compilé le code moi-même, pas d'erreurs de compilation concernant l'absence de définition de fonction, pourquoi?

  2. sizeof() a été utilisé sur l'un des appels, il apparemment exécuté sur les retours des fonctions, mais là encore, il n'y avait pas de définition. Comment était-ce possible?

    template <typename T> 
    struct is_pointer 
    { 
        template <typename U> 
         static char is_ptr(U*); 
    
        template <typename X, typename Y> 
         static char is_ptr(X Y::*); 
    
        template <typename U> 
         static char is_ptr(U (*)()); 
    
        static double is_ptr(...); 
    
        static T t; 
        enum {value = sizeof(is_ptr(t)) == sizeof(char)}; 
    }; 
    
+3

Code postal ** pas ** comme image mais comme texte au format code! –

+0

Avez-vous une instance de cette classe de modèle quelque part? – user0042

+0

Je suis sur mon appareil mobile en ce moment, donc je ne peux pas coller un code. La seule utilisation que j'avais était is_pointer :: valeur dans la fonction principale – user3414321

Répondre

4

sizeof est ce qu'on appelle un contexte évalué non. En lui, l'expression doit seulement être bien formée, rien ne sera réellement exécuté. Ainsi, une fonction déclarée seulement peut être utilisée à l'intérieur sans avoir besoin d'une définition réelle. Cela est dû au fait que la définition n'est pas requise pour déterminer les informations de type . Dans ce cas, la surcharge choisie par ADL est l'information de type en question. Son type de retour est également disponible à partir de la déclaration seule.

+0

Merci, cela m'a fait me gratter la tête, je savais que les fonctions de gabarit ne sont créées que lors de l'appel, donc je pensais que c'était appelé valeur. – user3414321

+1

@ user3414321 - Il y a aussi ça, mais dans ce cas c'est orthogonal à ce qui se passe. Si vous aviez essayé d'exécuter la surcharge de template, vous auriez l'erreur que vous attendez. – StoryTeller