Когда вы используете cast<int, float>
, учитываются оба шаблона.
template<typename T=int,typename U=float>
U cast(T x);
template<typename T=int,typename U=float>
T cast(U x);
, тогда мы подставляем:
template<typename T=int,typename U=float>
float cast(int x);
template<typename T=int,typename U=float>
int cast(float x);
, на данный момент нет типов для вывода.Итак, мы переходим к разрешению перегрузки.
В одном случае мы можем взять int
и преобразовать в float
при вызове cast, а в другом - int
и преобразовать в int
, когда вызовет cast.Заметьте, я совсем не смотрю на тело актеров;тело не имеет отношения к разрешению перегрузки.
Второе не преобразование (в точке вызова) является лучшим соответствием, поэтому выбирается перегрузка.
Если вы сделали это:
std::cout << cast<int>(10) << "\n";
вещи становятся более интересными:
template<typename T=int,typename U=?>
U cast(T x);
template<typename T=int,typename U=?>
T cast(U x);
для первого мы не можем вывести U
.Для второго мы можем.
template<typename T=int,typename U=?>
U cast(int x);
template<typename T=int,typename U=int>
int cast(int x);
, поэтому здесь у нас есть одна жизнеспособная перегрузка, и она используется.