私の知る限り、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>{};
私の理解では、根底にあるロジックはここでも同じです。この質問は、この回答へのコメントから生まれました。