Насколько я знаю, SFINAE означает, что ошибки замены не приводят к ошибкам компиляции, а просто удаляют прототип из списка возможных перегрузок.
Что я не понимаю: почему это SFINAE:
template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };
Но это не так?
template <bool C> struct assert;
template <> struct assert<true>{};
По моему мнению, основная логика здесь идентична. Этот вопрос возник из комментариев к этому ответу.