Eventuali duplicati:
Functions with const arguments and OverloadingPerché i qualificatori const sono argomenti della funzione utilizzati per la risoluzione dell'overload?
Io sono bello confuso dal sovraccarico e le regole di dichiarazione const. Qui ci sono due cose che mi incuriosiscono, forse puoi aiutarmi a trovare l'incomprensione più profonda nella mia testa che mi fa sembrare sconcertante. ;)
Prima edizione:
mio compilatore permette questo:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
Ma il seguente causa un errore di compilazione (funzione ha già un corpo):
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
che suppongo ha senso perché pensavo che il const fosse solo lì per dire al compilatore che l'oggetto che viene passato non è cambiato e nel secondo caso viene comunque copiato. Ma se questo è corretto, allora perché posso sovraccaricare le funzioni usando const?
In altre parole, perché se io uso la versione compilazione e chiamare le funzioni in questo modo:
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
ottengo "plain f" e "f const" invece di "f const" due volte? A quanto pare ora sto anche usando il const per dire al compilatore quale funzione chiamare non solo che il riferimento non cambia. Questo diventa più confuso perché se rimuovo la versione "semplice" funziona perfettamente e chiama la versione "const" due volte.
Ora qual è la mia domanda attuale? Mi piacerebbe sapere quali sono le idee dietro questo comportamento perché altrimenti memorizzarlo è molto difficile.
I qualificatori 'const' di livello superiore sui parametri di funzione sono _removed_ quando si determina la firma di una funzione. 'void f (int)' e 'void f (const int)' si riferiscono alla stessa funzione. Il livello principale 'const' non viene utilizzato per la risoluzione di sovraccarico. 'const' più in basso di un tipo derivato (come in' const int & ') influenza i tipi di parametri di funzione e quindi la firma della funzione. –
Vedi anche: http://stackoverflow.com/questions/4212932/defining-a-function-with-different-signature –
@CharlesBailey Grazie per i collegamenti. In qualche modo non ho trovato quelli, mi dispiace. – Sarien