8
votes

Tableau de fonctionnement surcharge: const * vs const &

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"


1 commentaires

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.


4 Réponses :


5
votes

La raison est parce que bar est un pointeur non-Const, donc int * const & int const * car Il n'est pas nécessaire d'ajouter const au type de pointeur.

si bar était const qualifié, ce serait une correspondance exacte pour la version t const * version.


0 commentaires

0
votes

Modèle Void FOO (t const *) nécessite un pointeur de const sur t . 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.

avec Modèle VOID FOO (t const &) Le type t est inféré est int * qui est donné par référence à la référence au fonction.


0 commentaires

3
votes
#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
}

0 commentaires

1
votes

Vous pouvez déterminer ce qui se passe avec vos types de modèles à l'aide de typeid . xxx

Ces sorties (note que la sortie exacte dépendra de votre compilateur) xxx

qui montre que dans le premier cas t = int * et le type d'argument complet est int * const & , et dans le deuxième t = int et le type d'argument complet est int const * .


0 commentaires