SFINAE funciona de manera diferente en casos de parámetros de plantilla tipo y no tipo

¿Por qué funciona este código?

template<
    typename T, 
    std::enable_if_t<std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

template<
    typename T, 
    std::enable_if_t<!std::is_same<T, int>::value, T>* = nullptr>
void Add(T) {}

y puede distinguir correctamente entre estas dos llamadas:

Add(1);
Add(1.0);

mientras que el siguiente código si se compila da como resultadoredefinición de Add () ¿error?

template<
    typename T, 
    typename = typename std::enable_if<std::is_same<T, int>::value, T>::type>
void Add(T) {}

template<
    typename T, 
    typename = typename std::enable_if<!std::is_same<T, int>::value, T>::type>
void Add(T) {}

Entonces, si el parámetro de plantilla es type, entonces tenemos una redefinición de la función, si no es type, entonces todo está bien.

Respuestas a la pregunta(5)

Su respuesta a la pregunta