Ответ 1
Когда вы используете 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);
поэтому здесь у нас есть одна жизнеспособная перегрузка, и она используется.