2015-03-19 30 views
6

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.

Odpowiedz

3

Tak, po prostu upuszczona zostanie bryła najwyższego poziomu. Błąd z gcc

redefinicja „void FM (void (*) (int))”

Jak widać const jest odrzucany.

żądanie z N3376 8.3.5/5

Po wytworzeniu listy typów parametrów, ewentualne najwyższego poziomu CV kwalifikatory modyfikowania parametru typu są usuwane podczas formowania typu funkcji.

+0

dlaczego spadł dla wartości i nie został usunięty dla odniesienia? – brachistochron

+0

@brachistochron tylko dlatego, że const w referencji nie jest const na najwyższym poziomie. – ForEveR

+0

Tak, weź, dzięki. ale wciąż nie może zrozumieć, dlaczego działa w ten sposób =) – brachistochron

2

Tak nie można przeciążać funkcje oparte na const ness non argumentu wskaźnik/non-odniesienia, patrz: Functions with const arguments and Overloading

Co z kolei oznacza, że ​​wskaźniki do funkcji, która Parametr może przyjmować pod względem wartości i wartości const są tego samego typu.