2012-04-12 20 views
5

vorrei sapere perché queste dichiarazioni non funzioneranno (non sono compatibili)funzioni ambigua in C++

void f(int); //p1 
void f(const int);//p2 
void f(int &);//p3 
void f(const int &);//p4 

Se ho capito bene, il compilatore non troverà una differenza tra (int &) e (const int &) e se scrivo f (12) non sarà in grado di scegliere tra le prime due dichiarazioni .. Ho ragione?

risposta

7

p3 e p4 sono perfettamente inequivocabili e distinguibili, p1 e p2 no. (E ovviamente p1/p2 sono distinguibili da p3 e p4.)

Il motivo è che il livello superiore const su un parametro di valore non è rilevabile e quindi inutile in una dichiarazione. È possibile ad esempio effettuare le seguenti operazioni:

void foo(int x); // declaration 
// ... 
void foo(const int x){ 
    // definition/implementation 
} 

Il const qui è un dettaglio di implementazione che non è importante per il chiamante, dal momento che si crea una copia in ogni modo. Quella copia è anche la ragione per cui non è distinguibile dal solo int, dal lato del chiamante è lo esattamente lo stesso.

Si noti che const int& r non ha un livello superiore const, è il riferimento che fa riferimento a un numero intero costante (i riferimenti sono sempre costanti). Per i puntatori, che possono essere modificati se non dichiarati const, vedere anche this question per dove inserire const.