Я объявляю два шаблона, первый преобразует аргумент x из типа T в тип U а второй из типа U в тип T Если я вызываю cast с 10, компилятор не жалуется. Я думаю, что оба отвечают требованиям, которые нужно использовать, и поэтому должна быть двусмысленность, это правда? Этот код печатает 10.
#include <iostream>
template<typename T, typename U>
U cast(T x) {
    return static_cast<U>(x);
}
template<typename T, typename U>
T cast(U x) {
    return static_cast<T>(x);
}
int main() {
    std::cout << cast<int,float>(10) << '\n';
}
