12
votes

Modèle de fonction spécialisé pour les types de référence

Pourquoi la sortie de ce code : xxx

est < BlockQuote>

Général
Général
Général

Le troisième est surprenant car la fonction a été spécialisée exactement pour int &

modifier: Je sais que la surcharge pourrait être une solution appropriée. Je veux juste apprendre la logique derrière elle.


10 commentaires

Peut-être parce que const int & est préféré à int &?


@Settagram: const int &?


Je ne sais pas si cela aide, mais si vous modifiez le modèle pour accepter un t & , alors f (y) et f (z) < / Code> Appelez la version int & .


@Daniel Gallagher: Ensuite, vous avez une erreur de compilateur avec f (2); . De plus, la sortie de f (y) est int & .


Le meilleur moyen est d'utiliser une surcharge Void F (int & param) gotw .ca / Publications / Mill17.htm


Vous pouvez passer à const t & et const int & pour faire f (2) travail, mais oui, f (y) , f (z) et f (2) appellera tous la version const int & .


@JohnsyWeb: Ideone.com/lrck6


Votre code ne devrait pas compiler. La spécification de modèle de fonction correcte ressemble à: modèle <> vide F (int & bla) ...


@NOAH ROBERTS: C'était une réponse à un commentaire supprimé;


@sad_man - hein? Je ne parlais pas de votre commentaire.


3 Réponses :


1
votes

Une référence est juste un alias, pas un type. Donc, lorsque vous appelez f (z), il correspond à la première version avec T = INT, qui est une meilleure option que t = int &. Si vous changez t vers T &, alors INT et INT & ARGuments appelleront la deuxième version.


1 commentaires

Si je change t à t &, j'ai une erreur de compilateur lorsque f (2) ou f ("texte")



9
votes

Le type de l'expression y et l'expression z est int . Une référence apparaissant dans une expression ne conserve pas le type de référence. Au lieu de cela, le type de l'expression sera le type référencé, l'expression étant une lvalue.

Ainsi, dans les deux cas, t est déduit à int , et donc la spécialisation explicite n'est pas utilisée du tout.

Qu'est-ce qui est important à noter (autre que vous devriez vraiment utiliser une surcharge, comme un autre gars a dit), est que vous avez un paramètre de fonction non-références dans votre modèle. Avant toute déduction de t contre le type d'argument est effectué, le type d'argument sera converti de tableaux à un pointeur à son premier élément (pour les fonctions, des arguments seront convertis en pointes de fonction). Donc, un modèle de fonction avec un paramètre de fonction de non-référence ne permet aucune déduction précise de toute façon.


2 commentaires

+1 (et merci d'avoir repéré l'erreur dans ma propre réponse pendant que je suis dessus)


À propos de votre deuxième phrase: D'où vient cette règle? Je vous fais confiance, mais avez-vous une source expliquant ce point? Merci.



0
votes

Je sais que ce n'est pas la réponse, mais je peux essayer cela, avec un trait comme une approche dans une structure: xxx


0 commentaires