Partage
  • Partager sur Facebook
  • Partager sur Twitter

Page 33, détermination de paramType

C++11/14, déduction d'un type

    10 novembre 2018 à 20:55:08

    Bonsoir OC,
    je fais appel à votre aide après plusieurs jours de réflexion sur un passage du conseil 4 (chapitre nommé "Afficher les types déduits". Le chapitre est passionnant).
    J'évite d'avancer trop vite quand un passage me résiste afin de bien comprendre.
    Ma question concerne le passage page 32-33 avec le code :
    template <typename T>
    void f(const T& param){
        std::cout<< typeid(T).name()<<'\n';
        std::cout<<typeid(param).name()<<'\n';
        }
    
    
        std::vector<Widget> createVec();
    
        const auto vw = createVect();
     
      
        if(!vw.empty())
        {
    
        f(&vw[0]);
     
        }
    Beaucoup de choses ont été dites sur ce code. Notamment qu'à l'exécution, typeid et std::type_info::name ne donnent pas les informations correctes dans ce cas plus complexe (avant d'en venir à Boost).
    En particulier, page 33, Scott Meyers dit que :
    "C'est pourquoi le type de param (en réalité un const Widget* const &) ....."
    Et c'est cela que j'essaie de prouver proprement depuis quelques jours.
    Pour cela, je reprends les choses que j'ai apprises grâce à gbdivers sur le fil précédent :
      - notamment &vw[0] est l'adresse d' un élément de type const Widget, soit un const widget*
      - la fonction template f est de la forme void f(const T& param)...
    donc on est dans le cas 1 du conseil 1 (page 11)
    Si maintenant, j'applique ce qui est dit dans le conseil 1 pour trouver paramTyppe, déjà &vw[0] (le fameux expr) n'est pas une référence (c'est un pointeur).
    Maintenant, et c'est là que ça bloque : on dit "effectuer ensuite une correspondance de motif entre le type de expr et paramType de façon à déterminer T
    à priori, le type de expr est : const Widget* (je l'ai déjà dit)
    ParamType est const T&
    Et là, je ne sais pas comment faire la correspondance proprement pour avoir T de manière à ce que finalement paramType soit bien const Widget* const & comme indiqué par Scott Meyers.
    à priori, et même si je sais que ça n'a pas de sens , j'aurais envie de dire que formellement const Widget * = const T& donc T = Widget*&
    De plus avec un tel T , on obtient paramType = const Widget *&&
    Mais ça n'a pas de sens je pense et ce n'est pas le   const Widget * const &
    Par avance merci pour votre aide

    CREDIT : "Programmez efficacement en C++, de Scott Meyers (Dunod). Copyright 2016 Dunod pour la version française 978-2-10-074391-9, et 2015 Scott Meyers pour la versio d'origine 978-1-491-90399-5"

    -
    Edité par pseudo-simple 10 novembre 2018 à 22:44:08

    • Partager sur Facebook
    • Partager sur Twitter
      10 novembre 2018 à 21:18:57

      Tu as un erreur de base qui fausse ton raisonnement:

      YES, man a écrit:

        - notamment &vw[0] est un pointeur sur un élément de type Widget*

      tel que tu as écrit, ça revient a dire que vw est un tableau de la forme

      std::vector<Widget*> vw;

      or ce n'est pas le cas: &vw[0] est un l'addresse d'un élèment de type Widget (et non Widget*) dit autrement, &vw[0] est de type Widget*

      Partant de là, T est de type Widget* donc param est de type const Widget* & (ou Widget* const & pour pas t'embrouiller)

      (sinon à un moment tu parles de "expr", perso je en vois pas de quoi il s'agit)

      -
      Edité par eugchriss 10 novembre 2018 à 21:20:36

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

        10 novembre 2018 à 21:26:50

        Oui, sur ce passage, je me suis un peu emmêlé les pinceaux. Je corrige maintenant.

        POur l'instant, je te suis.

        Par contre, c'est après que ça me pose problème.

        Ici, expr, c'est &vw[0] justement.

        J'espère que çe peut t'aider à en déduire le const Widget * const &

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2018 à 21:53:32

          > , j'aurais envie de dire que formellement const Widget * = const T& donc T = Widget*& > De plus avec un tel T , on obtient paramType = const Widget *&&

          La conclusion est mauvaise, on obtient const Widget *& & (l'espace est important) ce qui donne une référence. Remplace les symboles par des mots et ajoute des parenthèses, tu y verras plus clair.

          > notamment &vw[0] est l'adresse d' un élément de type const Widget, soit un const widget*.

          vw n'est pas constant, alors l'élément ne l'est pas non plus.

          -
          Edité par jo_link_noir 10 novembre 2018 à 21:54:29

          • Partager sur Facebook
          • Partager sur Twitter
            10 novembre 2018 à 22:09:45

             @joe_link_noir : avec cette ligne :

            const auto vw = createVect();

            si vw n'est pas const, comment peut-il être déclaré const alors ?

            Apparemment, vw prend le résultat d'une rvalue ( l'objet temporaire createVect() ). L'objet createVect() est détruit  lors du passage à l'intruction suivante ? N'est-ce pas ?

            -
            Edité par pseudo-simple 10 novembre 2018 à 22:11:24

            • Partager sur Facebook
            • Partager sur Twitter
              10 novembre 2018 à 22:35:39

              je parle de la ligne 9, j'ai même pas fait gaffe à la 7.

              > L'objet createVect() est détruit lors du passage à l'intruction suivante ? N'est-ce pas ?

              Oui et alors ? Après il y a des optimisations derrière qui font qu'il n'y a pas de temporaire dans cette expression (obligatoire en c++17).

              • Partager sur Facebook
              • Partager sur Twitter
                10 novembre 2018 à 22:55:04

                J'ai réagencé un peu le code :

                donc avec la ligne 10, vw est un const std::vector<Widget> ?

                Si oui, je reprends proprement mon raisonnement  formellement :

                &vw[0] est l'adresse d'un élément de type const Widget, donc c'est const Widget*.

                Maintenant, ce "expr" pour remployer la terminologie de Scott Meyers est transmis à la fonction template f.

                Il faut déterminer T et paramType. Et on est dans le cas 1 :

                &vw[0] n'étant pas une référence, on doit identifier les motifs  const T& =const Widget*

                Si je "simplifie", il reste : T& = Widget*

                Donc T = Widget* "divisé par" &  (ça d'ailleurs, je ne sais pas comment l'exprimer formellement sans garder le "divisé par")

                Donc paramType = const Widget*

                Ce qui n'est pas le const Widget * const& attendu

                -
                Edité par pseudo-simple 10 novembre 2018 à 23:08:00

                • Partager sur Facebook
                • Partager sur Twitter
                  11 novembre 2018 à 7:33:15

                  J'ai regardé ton lien. Merci. Pour l'instant, ça n'aide pas trop à résoudre mon cas particulier à priori
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Page 33, détermination de paramType

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown