SFINAEを新しくしました。私は気付いた:SFINAEでのテンプレート減算
template <typename T> void f(T t) { t.Crash(); } // version 1
void f(...) { } // The sink.
f(1);
template <typename T> void f(const T& t, typename T::iterator* it = nullptr) { } // version 2
void f(...) { } // The sink.
f(1);
バージョン2では、SFINAEのため、エラーをスローして楕円シンクを選択しません。なぜバージョン1では、コンパイラが停止して不平を言うのですか?
SFINAEは身体ではなく署名にのみ適用されますか?バージョン1ではテンプレート関数を優先しますが、どの段階でコンパイラが停止してエラーをスローしますか?
テンプレートオーバーロードの解消に関しては、コンパイラの処理段階を明示的に説明してください。