Je travaille actuellement sur 'Effective Modern C++' pour mettre à jour mes connaissances du langage, et je viens juste de terminer le point 27, qui traite des fonctions de surcharge qui prennent de l'avance (ou le livre les appelle) références. En utilisant le code suivant je l'ai écrit:Résolution des arguments/paramètres de la fonction en C++
#include <iostream>
template <typename T>
void func(T&& param) {
std::cout << "forwarding reference version\n";
}
void func(int param) {
std::cout << "int version\n";
}
int main() {
func(29);
}
S'il vous plaît quelqu'un peut-il expliquer pourquoi la version int est appelée, même si 29 est un rvalue et donc le modèle devrait instancier à « void Func (int & & param) » et appel devrait être à la version de transfert? De toute évidence, c'est ce que c'est, et il me manque manifestement de la compréhension, mais des éclaircissements sur ce point seraient utiles. Je comprends que la norme dit dans le cas de signatures de fonctions identiques, une fonction non-basée sur le modèle devrait être préférée, mais (dans mon esprit au moins) cela ne s'applique pas ici? Merci beaucoup.
Cordialement, Phil
Remarque 'func (int &&)' n'est pas une meilleure correspondance que 'func (int)'. Si vous avez ces deux types de non-modèles, l'appel est ambigu. – aschepler
Parce que sûrement le modèle de correspondance void func (int && param) serait meilleur que void func (int param) - ils ne sont pas les mêmes. Ou suis-je juste un idiot? Entièrement possible j'admets :-) – PhilPotter1987
@aschepler: ah, je vois, c'est là que mon manque de compréhension est. J'ai supposé qu'ils seraient différents et surchargeables - n'ont pas réellement essayé cela. S'il vous plaît poster cela comme une réponse et je serai heureux d'accepter. – PhilPotter1987