2017-01-10 1 views
3

Dans le code suivant je définir deux surcharges, on accepter un entier et l'autre référence à un nombre entier ...Sélection surcharge fonction acceptant référence

#include <stdio.h> 

void foo(int) { printf("foo(int)\n"); } 
void foo(int&) { printf("foo(int&)\n"); } 

Je suis en train d'appeler les deux

surcharges
int main(int argc, const char *argv[]) { 
    foo(3);  // Calls foo(int) 
    int x = 3; 
    foo(x);  // <--- compilation error (ambiguous overload) 
    int& y = x; 
    foo(y);  // <--- still ambiguous 
    return 0; 
} 

la question est ... comment la surcharge int& peut être sélectionné?

S'il ne peut pas être appelé, à quoi sert-il de le compiler?

+3

'static_cast (foo) (x);' –

+2

Peut-être pas direct dupe, puisque vous demandez aussi pourquoi, mais très [connexes] (http://stackoverflow.com/ questions/1336 8474/ambiguous-call-to-overloaded-function-int-and-int) – George

+1

Pourquoi ajouter de la complexité à la grammaire en exigeant un diagnostic simplement pour l'existence de surcharges? Ce sont toujours deux surcharges valides. Le problème est sur le site d'appel (avec des moyens autour de lui). – StoryTeller

Répondre

3

Comment la surcharge int& peut-elle être sélectionnée?

l'aide d'un pointeur de fonction:

using fptr = void (*)(int&); 
fptr f = foo; 
int i; 
f(i); 

Et pour ceux qui errent ici, à la recherche d'un moyen de surcharger lvalues ​​et rvalues ​​sensiblement, la solution est d'utiliser des références rvalue:

void foo(int&&) { printf("foo(int&&)\n"); } 
void foo(int&) { printf("foo(int&)\n"); }