je vais essayer de te repondre avec mon niveau. Je laisse les autres confirmer/infirmer.
1)Ts... ou ...Ts qui sont equivalents, ne sont pas des types à part entiere. Par contre Ts tout seul est bien un type. Ts... peut etre vu comme un tableau de type(voire une liste de type, c'est plus proche semantiquement parlant)
2)Ts&& dans ce cas precis est une universal value et non une r-value reference. Pour le reste cf 1)
3) Ts&& param est une universal reference, dont la categorie (l/r-value) depend du code appelant. Si dans le code appelant param est une l-value, le param dans la-dite fonction sera elle aussi une l-value. Pareille pour les r-value. Partant de là, le param dans:
est soit une l-value, soit une r-value. S'il s'agit d'une l-value, c'est la 1iere version de std::forward qui est appelée. Si au contraire c'est une r-value, c'est la 2 ieme version qui l'est cette fois.
C'est un pack ! C'est même un cadeau surprise! On ne sait pas ce qu'il contient, et il peut d'ailleurs ne rien contenir du tout... On ne le saura que lrosqu'on commencera à l'ouvrir!
Comment veux tu que ce soit autre chose que "ts"??
Or params étant de type " Ts&.. " , et le type devrait être : "typenamestd::remove_reference<T>::type& t"
Donc pourquoi on peut passer params, qui est de type Ts&&... ?
Merci pour votre aide
Parce qu'on crée le pack spécialement pour pouvoir te le donner sous la forme d'une référence générique (raison du Ts&&). Comme il y a un & en trop pour pouvoir le transmettre sous la forme d'une l value reference, std::forward va se charger de le retirer
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Eug