C++
Surcharge du modèle de fonction
Recherche…
Remarques
- Une fonction normale n'est jamais liée à un modèle de fonction, malgré le même nom, même type.
- Un appel de fonction normal et un appel de modèle de fonction généré sont différents même s'ils partagent le même nom, le même type de retour et la même liste d'arguments
Qu'est-ce qu'une surcharge de modèle de fonction valide?
Un modèle de fonction peut être surchargé selon les règles de surcharge de la fonction non-modèle (même nom, mais différents types de paramètres) et en plus, la surcharge est valide si
- Le type de retour est différent ou
- La liste des paramètres du modèle est différente, sauf pour la désignation des paramètres et la présence d'arguments par défaut (ils ne font pas partie de la signature)
Pour une fonction normale, la comparaison de deux types de paramètres est facile pour le compilateur, car il contient tous les informat. Mais un type dans un modèle peut ne pas encore être déterminé. Par conséquent, la règle à appliquer lorsque deux types de paramètres sont égaux est approximative et indique que les types et valeurs non dépendants doivent correspondre et que l’orthographe des types et expressions dépendants doit être la même (plus précisément, ils doivent être conformes à la règles ODR), sauf que les paramètres du modèle peuvent être renommés. Cependant, si des orthographes si différentes, deux valeurs dans les types sont considérées différentes, mais instancient toujours aux mêmes valeurs, la surcharge est invalide, mais aucun diagnostic n'est requis du compilateur.
template<typename T>
void f(T*) { }
template<typename T>
void f(T) { }
C'est une surcharge valide, car "T" et "T *" sont des orthographes différentes. Mais ce qui suit est invalide, sans diagnostic requis
template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }
template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }