C++
Functiesjabloon overbelast
Zoeken…
Opmerkingen
- Een normale functie is nooit gerelateerd aan een functiesjabloon, ondanks dezelfde naam, hetzelfde type.
- Een normale functie-aanroep en een gegenereerde functiesjabloon-aanroep zijn verschillend, zelfs als ze dezelfde naam, hetzelfde retourtype en dezelfde argumentlijst delen
Wat is een geldige functiesjabloonoverbelasting?
Een functiesjabloon kan worden overbelast volgens de regels voor niet-sjabloonfunctie-overbelasting (dezelfde naam, maar verschillende parametertypen) en daarnaast is de overbelasting geldig als
- Het retourtype is anders, of
- De sjabloonparameterlijst is anders, behalve de naamgeving van parameters en de aanwezigheid van standaardargumenten (ze maken geen deel uit van de handtekening)
Voor een normale functie is het vergelijken van twee parametertypen eenvoudig voor de compiler, omdat deze alle informat heeft. Maar een type binnen een sjabloon kan nog niet worden bepaald. Daarom is de regel voor wanneer twee parametertypen gelijk zijn hier bij benadering en zegt dat de niet-depependend-typen en waarden moeten overeenkomen en dat de spelling van afhankelijke typen en uitdrukkingen hetzelfde moet zijn (meer precies, ze moeten voldoen aan de zogenaamde ODR-regels), behalve dat sjabloonparameters kunnen worden hernoemd. Als echter onder dergelijke verschillende spellingen twee waarden binnen de typen als verschillend worden beschouwd, maar altijd dezelfde waarden hebben, is de overbelasting ongeldig, maar is er geen diagnose vereist van de compiler.
template<typename T>
void f(T*) { }
template<typename T>
void f(T) { }
Dit is een geldige overbelasting, omdat "T" en "T *" verschillende spellingen zijn. Maar het volgende is ongeldig, zonder diagnostische gegevens
template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }
template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }