Why does the first overload get silently removed from the candidate set rather than causing a hard compile error when `T = int`, and what is the name of the principle at work?
template<class T> typename T::type f(T) { return {}; }
template<class T> int f(T) { return 0; }
int x = f(42);