Lorsque j'ai deux surcharges de fonction modèles telles que ceci:
int* bar; foo( bar ); // prints "const reference version" char const* baz; foo( baz ); // prints "const pointer version"
4 Réponses :
La raison est parce que si bar code> est un pointeur non-Const, donc int * const & est une meilleure correspondance que int const * code> car Il n'est pas nécessaire d'ajouter const code> au type de pointeur. p>
bar code> était const code> qualifié, ce serait une correspondance exacte pour la version t const * code> version. P>
avec Modèle t code>. Eh bien, si c'était la seule déclaration que vous avez eue, il y aura une erreur de compilation car vous essayez de transmettre un pointeur non constitué comme argument. p>
Modèle t code> est inféré est int * code> qui est donné par référence à la référence au fonction. p>
#include <iostream>
using namespace std;
void foo(int const&) {
cout << "const reference" << endl;
}
void foo(int) {
cout << "hi there" << endl;
}
int main() {
int hi;
foo(hi); //const reference
}
Vous pouvez déterminer ce qui se passe avec vos types de modèles à l'aide de Ces sorties (note que la sortie exacte dépendra de votre compilateur) P > qui montre que dans le premier cas typeid code>. t = int * code> et le type d'argument complet est int * const & code>, et dans le deuxième t = int code> et le type d'argument complet est int const * code>. p> p>
Vous pouvez trouver une belle explication de ce problème sur Channel 9: canal9.msdn.com/series/c9-lectures-Stephan-t-lavavej-core- c- / ... . Mais fondamentalement, Mark B a répondu à votre question.