pojawia się pytanie o przeciążenie funkcji. Spójrz na ten kod:Funkcja przeciążania wskaźnikiem funkcji
#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;
}
jeśli Odkomentuj void fm(void(*fun)(int))
funkcja okaże się, że kompilator nie może statycznie przeciążenia funkcji przez wskaźnik na funkcję, która akceptuje parametr wartości i wskaźnik na funkcję, które akceptują wartości const. Ponadto, jeśli odkomentujesz void(*fun)(const int)
i skomentujesz void(*fun)(const int)
, wszystkie kompilacje zakończą się sukcesem. Ale jeśli używamy referencji, kompiluje się OK. Nie rozumiem dlaczego, czy mógłbyś mi wyjaśnić? Czy to oznacza, że wskaźniki do działania, które przyjmują parametr według wartości i według wartości stałej to te same typy?
UPD: Top-level const doesn't influence a function signature Istnieje dobre wyjaśnienie, dlaczego należy usunąć stałą najwyższego poziomu.
dlaczego spadł dla wartości i nie został usunięty dla odniesienia? – brachistochron
@brachistochron tylko dlatego, że const w referencji nie jest const na najwyższym poziomie. – ForEveR
Tak, weź, dzięki. ale wciąż nie może zrozumieć, dlaczego działa w ten sposób =) – brachistochron