C++
Sovraccarico del modello di funzione
Ricerca…
Osservazioni
- Una funzione normale non è mai correlata a un modello di funzione, nonostante lo stesso nome, lo stesso tipo.
- Una chiamata di funzione normale e una chiamata di modello di funzione generata sono diverse anche se condividono lo stesso nome, lo stesso tipo di ritorno e lo stesso elenco di argomenti
Cos'è un sovraccarico del modello di funzione valido?
Un modello di funzione può essere sovraccaricato in base alle regole per l'overloading delle funzioni non modello (stesso nome, ma diversi tipi di parametri) e in aggiunta a ciò, il sovraccarico è valido se
- Il tipo di reso è diverso, o
- L'elenco dei parametri del modello è diverso, ad eccezione della denominazione dei parametri e della presenza di argomenti predefiniti (non fanno parte della firma)
Per una funzione normale, il confronto di due tipi di parametri è facile per il compilatore, poiché ha tutte le informazioni. Ma un tipo all'interno di un modello potrebbe non essere ancora determinato. Pertanto, la regola per quando due tipi di parametri sono uguali è approssimativo e afferma che i tipi e i valori non dipendenti dalla dipendenza devono corrispondere e che l'ortografia dei tipi e delle espressioni dipendenti deve essere la stessa (più precisamente, devono essere conformi al le cosiddette regole ODR), con la differenza che i parametri del modello possono essere rinominati. Tuttavia, se con tali ortografie diverse, due valori all'interno dei tipi sono considerati diversi, ma verranno sempre istanziati agli stessi valori, l'overloading non è valido, ma non è richiesta alcuna diagnostica dal compilatore.
template<typename T>
void f(T*) { }
template<typename T>
void f(T) { }
Questo è un sovraccarico valido, poiché "T" e "T *" sono ortografie diverse. Ma quanto segue non è valido, senza necessità di diagnostica
template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }
template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }