Ответ 1
Типовые черты обычно реализуются с использованием идиомы SFINAE, которая помещает потенциально неправильно сформированное выражение внутри объявления шаблона функции. Подстановка соответствующего имени в декларацию приводит к ошибке, но в этом контексте ошибка подавляется, поэтому декларация либо используется, либо нет. Но резервная перегрузка поддерживает потенциально отсутствующую декларацию. Еще один бит кода обращается к функции, чтобы определить, была ли реализована чувствительная перегрузка или только резервная копия.
Это не будет работать для final
, потому что это может привести к сбою при создании экземпляра шаблона. Там нет способа перегрузить классы, и нет возможности предварительно определить класс, который будет терпеть неудачу, но не остановить компиляцию в случае, если он был получен из окончательного.
Стандартная цитата, С++ 11 §14.8.2/8:
Только недопустимые типы и выражения в непосредственном контексте типа функции и ее типа параметров шаблона могут привести к ошибке дедукции. [Примечание. Оценка замещенных типов и выражений может приводить к возникновению побочных эффектов, таких как создание специализированных специализированных шаблонов классов и/или функциональных шаблонов, генерация неявно определенных функций и т.д. Такие побочные эффекты не находятся в "непосредственном контекста" и может привести к плохому формированию программы. - конечная нота]