2010-03-16 5 views
7

Ho ricevuto la risposta NO! Perché passare per valore e passare per riferimento sembra identico al chiamante.È possibile sovraccaricare una funzione basandosi solo sul fatto che un parametro sia un valore o un riferimento?

Tuttavia, il codice qui sotto compila destra

class A { 

public: 
void f(int i) {}  

void f(int& i) {} 
}; 

Ma quando cerco di usarlo, non c'è errore di compilazione.

int main() { 

    A a; 
    int i = 9; 
    int& j = i; 
    a.f(1); 
    a.f(i); 
    a.f(j); 
    return 0; 
} 

Perché il compilatore non lo disabilita anche senza sapere che verrà utilizzato?

+2

Sarebbe utile se hai mostrato il numero di errore del compilatore e la linea attuale. –

+3

dupe: http://stackoverflow.com/questions/930323/f5-and-int-x-fx-to-call-different-functions –

risposta

3

Sì, possono essere sovraccaricati in base al riferimento oppure no. Ecco perché è perfettamente bene farli convivere così; sono diversi.

Il problema ha a che fare con l'ambiguità. Mentre f(1) può essere chiamato solo su una variazione, è possibile chiamare f(i) su entrambi. Né è preferibile, quindi si ottiene un errore per l'ambiguità. Se hai aggiunto una terza funzione, foo (const int&), tutte le chiamate sarebbero ambigue. Ma tutti sono ancora sovraccarichi l'uno dell'altro e non conflittuali.

Sono d'accordo che è strano essere in grado di avere tre sovraccarichi di una funzione, ed essere in grado di chiamare direttamente nessuno. Forse qualcun altro ha altro da aggiungere.

9

È possibile chiamare ogni metodo:

void (A::*t)(int&) =&A::f; 
A a; 
int i = 9; 
int& j = i; 
a.f(1); // f(int i) 
(a.*t)(i); // f(int& i) 
+1

+1 per intelligente :) – GManNickG

+5

'(a. * F) (i) ; dovrebbe essere sufficiente –

+1

probabilmente intendevi (a. * T) (i); (non (a. * f)) – a1ex07