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 :
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
> , 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
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
J'ai regardé ton lien. Merci. Pour l'instant, ça n'aide pas trop à résoudre mon cas particulier à priori
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.
Eug