2017-09-21 1 views
1

Dans l'exemple suivant, j'attend intuitivement l'appel à inc(iref) pour appeler la fonction inc avec T=int&, puisque c'est le type de iref. Cependant, il semble que le & est supprimé lorsque la variable est transmise à une fonction, conduisant ainsi à T=int dans le cas des deux inc(i) ainsi que inc(iref). Le comportement auquel je m'attendais ne se produit que lorsque je spécifie explicitement le paramètre de modèle comme référence.Pourquoi les paramètres du modèle de référence ne sont-ils pas déduits automatiquement?

template<typename T> 
void inc(T t) { 
    t++; 
} 

int main() { 
    int i = 41; 
    int& iref = i; 

    iref++; 
    std::cout << i << " " << iref << std::endl; // prints 42 42, as expected 

    inc(i); 
    std::cout << i << " " << iref << std::endl; // still prints 42 42, as expected 

    inc(iref); 
    std::cout << i << " " << iref << std::endl; // prints 42 42, instead of 43 43 

    inc<int&>(iref); 
    std::cout << i << " " << iref << std::endl; // now finally prints 43 43 
} 

Alors, mes questions sont les suivantes:

  • Pourquoi la référence apparemment transformé en une valeur 'nue' lorsqu'il est passé par inc(iref)? Quel est le processus derrière tout cela?
  • Pourquoi cela fonctionne-t-il de cette façon/quelle est la logique derrière cette décision de conception? Y aurait-il des problèmes ou des conséquences négatives si cela fonctionnait comme je m'y attendais intuitivement?
+0

Comment passez-vous par copie avec votre chemin? – Jarod42

+0

Et vous manquez 'inc (i);'. – Jarod42

+0

La réponse [ici] (https://stackoverflow.com/questions/3786736/template-type-deduction-of-reference) est parfaite, pas sûre à 100% si elle devrait être dupe fermée cependant. – NathanOliver

Répondre

-1

La référence est dépouillée de sa valeur de référence car si elle n'est pas iref, elle est ambiguë (int & ou int). Il est conçu de cette manière afin que vous puissiez le surcharger comme:

#include <iostream> 

template<typename T> 
void inc(T& t) { 
    t++; 
} 

int main() { 
    int i = 41; 
    int& iref = i; 

    inc(iref); 
    std::cout << iref << std::endl; 
} 
+0

Quel est le problème avec cette réponse? – Hedron