2015-03-19 33 views
6

. Bu kodun bak:Fonksiyon aşırı yük fonksiyonlarıyla ilgili bir fonksiyon işaretçisi

#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; 
} 

eğer yorumsuz statik const değeri kabul fonksiyon üzerindeki değeri ve gösterici tarafından parametresini kabul işlevini gösterici tarafından işlevi aşırı olamayacağını derleyici bulmak void fm(void(*fun)(int)) fonksiyonu. Ayrıca, void(*fun)(const int) uncomment ve void(*fun)(const int) yorumunu yaparsanız, tüm bunlar başarıyla derler. Ancak, referansları kullanırsak Tamam derler. Neden anlama, lütfen bana açıklayabilir misin? Bu, parametreyi değer ve const değerine göre kabul eden işlevlerin aynı tür olduğu anlamına mı geliyor?

UPD: Top-level const doesn't influence a function signature Üst düzey const'ın neden kaldırılması gerektiği konusunda iyi bir açıklama var.

cevap

3

Evet, üst düzey const yalnızca bırakılacak. gcc Hata ‘boşluk fm (void (*) (int))’ seçeneğini const görebileceğiniz gibi

ait

yeniden tanımlanması düşürülür. fonksiyon tipi şekillendirme parametre türlerinin listesini üretmek sonra

/5 N3376 8.3.5 den

Alıntı, bir parametre türü modifiye herhangi bir üst düzey ev-kalifiye silinir.

+0

neden değerler için düştü ve referanslar için düşmedi? – brachistochron

+0

@brachistochron, sadece referans olarak en üst düzey const değil. – ForEveR

+0

evet, al, teşekkürler. ama hala bu şekilde çalıştığını anlayamıyorum =) – brachistochron

2

Evet olmayan bir işaretçi/olmayan referans tartışmanın const lık dayalı işlevleri aşırı olamaz, bakınız: sırayla işaretçileri değeri ve const değerle kabul parametreyi çalışması anlamına gelir Functions with const arguments and Overloading

aynı tip