c'è una domanda sulle funzioni di sovraccarico. Guardate questo codice:Sovraccarico delle funzioni tramite il puntatore di funzione
#include<iostream>
void fv(int){}
void fc(const int){}
void fvr(int&){}
void fcr(const int&){}
void fm(void(*fun)(const int))
{
std::cout << "Constant called" << std::endl;
}
//void fm(void(*fun)(int))
//{
// std::cout << "non Constant called" << std::endl;
//}
void fm(void(*fun)(const int&))
{
std::cout << "Constant ref called" << std::endl;
}
void fm(void(*fun)(int&))
{
std::cout << "non Constant ref called" << std::endl;
}
int main()
{
fm(&fc);
fm(&fv);
fm(&fvr);
fm(&fcr);
return 0;
}
se decommentare void fm(void(*fun)(int))
funzione si scopre che il compilatore non può sovraccaricare staticamente funzione puntatore sulla funzione che accetta parametri per valore e il puntatore sulla funzione che accetta il valore const. Inoltre, se si annulla il commento void(*fun)(const int)
e il commento void(*fun)(const int)
, tutto viene compilato correttamente. Ma se usiamo i riferimenti compila OK. Non capisco perché, potresti spiegarmi per favore? Questo significa che i puntatori a funzionare che accettano parametro per valore e per valore const sono gli stessi tipi?
UPD: Top-level const doesn't influence a function signature C'è una buona spiegazione perché il const di livello superiore deve essere rimosso.
perché è stato eliminato per i valori e non è stato rilasciato per i riferimenti? – brachistochron
@brachistochron solo perché const in riferimento non è const di livello superiore. – ForEveR
sì, capito, grazie. ma ancora non riesci a capire perché funziona in questo modo =) – brachistochron