When you use cast<int, float>
, both templates are considered.
template<typename T=int,typename U=float>
U cast(T x);
template<typename T=int,typename U=float>
T cast(U x);
we then substitute:
template<typename T=int,typename U=float>
float cast(int x);
template<typename T=int,typename U=float>
int cast(float x);
at this point, there are no types to deduce. So we go to overload resolution.
In one case, we can take an int
and convert to float
when calling cast, and in the other we take a int
and convert to int
when calling cast. Note I'm not looking at all into the body of cast; the body is not relevant to overload resolution.
The second non-conversion (at the point of call) is a better match, so that overload is chosen.
If you did this:
std::cout << cast<int>(10) << "\n";
things get more interesting:
template<typename T=int,typename U=?>
U cast(T x);
template<typename T=int,typename U=?>
T cast(U x);
for the first one, we cannot deduce U
. For the second one we can.
template<typename T=int,typename U=?>
U cast(int x);
template<typename T=int,typename U=int>
int cast(int x);
so here we have one viable overload, and it is used.