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?
Comment passez-vous par copie avec votre chemin? – Jarod42
Et vous manquez 'inc(i);'. –
Jarod42
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