Entendendo a SFINAE

Tanto quanto eu sei, SFINAE significa falhas de substituição não resultam em erros de compilação, mas apenas remover o protótipo da lista de possíveis sobrecargas.

O que eu não entendo: por que isso é SFINAE:

template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };

Mas isso não é?

template <bool C> struct assert;
template <> struct assert<true>{};

Pelo que entendi, a lógica subjacente é idêntica aqui. Esta questão emergiu dos comentários paraesta resposta.

questionAnswers(1)

yourAnswerToTheQuestion