Il s'agit de ce que l'exemple montre. En somme, ce sont les conversions
- Le paramètre de fonction peut être un
Base<T>
, tandis que l'argument de la fonction est un Derived<T>
. Comparer avec ifstream << "hello"
- le côté gauche de operator<<
est déduit de cette façon.
- Le paramètre de la fonction peut être un
const U&
, tandis que l'argument de la fonction est un U
(identique pour le volatile).
- Le paramètre de la fonction peut être un
const U*
ou un const E C::*
alors que l'argument de la fonction est un U*
ou E C::*
respectivement (il s'agit des conversions de qualification) - même pour les volatiles.
D'autres conversions ne peuvent pas être effectuées pour un paramètre/argument de fonction qui participe à la déduction. Toute la gamme de conversions peut être appliquée si un paramètre de fonction participe à la déduction, mais cela nécessite un contexte non déduit ou un contexte où il n'y a pas d'argument à déduire du tout, et l'implémentation n'est pas vraiment d'accord il (voir here).
En d'autres termes:
template<typename T> struct id { typedef T type; };
template<typename T> void f(T, typename id<T>::type);
int main() {
// deduction acts on void(int*, int*) - deduction does not need
// to deduce anything and follows [temp.arg.explicit]p4
f<int*>(0, 0);
// deduction acts on void(T, id<T>::type) - second is a non-deduced context,
// which *will* allow the conversion of int -> int*, since it will not compare
// the argument with parameter during deduction (since it is non-deduced).
f((int*)0, 0);
}
Le deuxième exemple est vital pour some partial ordering contextes de travail.
Pouvez-vous s'il vous plaît poster la phrase entière, au lieu d'une partie de celui-ci? Ce n'est pas clair quelle est votre question. –
S'il s'agit de devoirs, veuillez le marquer comme tel. Nous ne résoudrons pas vos devoirs pour vous, mais nous vous fournirons des conseils qui vous aideront à * comprendre *. –
@Konrad Rudolph: C'est un point/une déclaration de la norme ISO C++ 14.8.3/5: Résolution de surcharge –