2015-03-19 17 views
6

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.

risposta

3

Sì, il const di livello superiore verrà eliminato. Errore da gcc

ridefinizione del ‘fm (void (*) (int))’

Come si può vedere const è caduto.

preventivo da N3376 8.3.5/5

Dopo aver prodotto l'elenco dei tipi di parametri, eventuali primo livello CV-qualificazioni modifica di un tipo di parametro vengono eliminati quando si forma il tipo funzione.

+0

perché è stato eliminato per i valori e non è stato rilasciato per i riferimenti? – brachistochron

+0

@brachistochron solo perché const in riferimento non è const di livello superiore. – ForEveR

+0

sì, capito, grazie. ma ancora non riesci a capire perché funziona in questo modo =) – brachistochron

2

Sì, non si può sovraccaricare le funzioni basate sul ness const di un argomento non puntatore/non-reference, vedi: Functions with const arguments and Overloading

Che a sua volta implica che i puntatori a funzione che il parametro accetta per valore e il valore const sono dello stesso tipo