Когда вы устанавливаете шаблон, он всегда использует базовую версию, прежде чем смотреть на специализации.Это работает здесь, так как второй параметр шаблона имеет значение по умолчанию match_type
.
Итак
simple_check<match_type> => simple_check<match_type, match_type>
^^ this uses the default value
simple_check<match_type_bad> => simple_check<match_type_bad, match_type>
^^ again, default value
После того, как это сделано, компилятор смотрит на специализации.
Специализацияработает только в том случае, если параметры шаблона совпадают, поэтому для первой проверки специализация будет выбрана поверх базового шаблона, а для второй будет использоваться базовый шаблон, так как специализация недействительна.