J'ai lu moderne et efficace C++ et la chose suivante a attiré mon attention:Lvalue/rvalue -nes codant pour des références universelles
Dans l'article 28 Scott écrit:
Ensemble, ces observations sur universel références et encodage lvalue/rvalue signifient que pour ce modèle
template<typename T> void func(T&& param);
le paramètre T modèle déduit sera en code si l'argument passé à param était une lvalue ou un rvalue. Le mécanisme de codage est simple. Lorsqu'une valeur lvalue est passée en argument, T est déduite pour être une référence lvalue. Quand un rvalue est passé, T est déduit pour être une non-référence. (Note de l'asymétrie: lvalues sont codées comme références lvalue, mais rvalues sont codés comme non-références.)
Quelqu'un peut-il expliquer pourquoi un tel mécanisme de codage a été choisi? Je veux dire que si nous allons suivre les règles de réduction de référence que l'utilisation du modèle ci-dessus avec rvalue donne la référence rvalue. Et pour autant que je sache, tout fonctionnerait exactement de la même façon s'il était déduit comme référence. Pourquoi est-il codé comme non-référence?
BTW, le terme «référence universelle» ne s'est pas accroché, et le comité a choisi d'utiliser [référence de transfert] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ 2014/n4164.pdf) à la place. –
Je pense que votre question pourrait être la même que celle-ci http://stackoverflow.com/questions/32282705/a-failure-to-instantiate-function-templates-due-to-universal-forward-reference – aldr
Voir http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm esp. #7. IIRC, Howard Hinnant a déjà déclaré que l'introduction de '&&&' uniquement pour la transmission de références ne serait probablement pas acceptée à ce moment-là (en tant que troisième type de référence). – dyp