Ответ 1
Проще говоря, GCC не должен отклонять вашу программу, и Clang не должен ее принимать. Он плохо сформирован, никакой диагностики не требуется. Поскольку TestImpl
является неполным, ваш шаблон нарушает
... Программа плохо сформирована, не требуется диагностика, если:
- гипотетическое создание шаблона сразу после его определения будет плохо сформировано из-за конструкции, которая не зависит от параметра шаблона, или
- интерпретация такой конструкции в гипотетическом экземпляре отличается от интерпретации соответствующей конструкции в любом фактическом экземпляре шаблона.
Можно утверждать, что вызываемый конструктор зависит, но имя класса, безусловно, нет!
В нашем случае гипотетическая инстанция с пакетом из двух строк сразу после определения шаблона даст разные результаты, чем в момент создания в вашей программе. Это связано с тем, что само имя класса (которое, опять же, не зависит) имеет разное значение в двух контекстах.
Это не допустимое определение шаблона. Но GCC осуществляет некоторую свободу действий здесь, поскольку никакой диагностики не требуется, и вспахивания.
Это кратко изложено в примечании под пулями, которое, хотя и не является нормативным, описывает ваше дело:
Это может произойти в ситуациях, в том числе:
- тип, используемый в не зависящем от имени имени, является неполным в точке, где шаблон определен, но завершен в момент, когда выполняется инстанцирование, или