Ответ 1
Шаблон создается при его использовании. Однако он должен быть скомпилирован, когда он будет определен. В вашем коде A(0)
используется имя A
, которое не зависит от параметра шаблона T
, поэтому оно должно быть разрешено при определении шаблона. Это называется двухфазным поиском. То, как clang находит ошибку, просто пытается решить вызов A(0)
, как только он его увидит.
Моя версия GCC также незаметно компилирует этот код, даже с -pedantic-errors
. Как С++ 03, так и С++ 11 говорят, что диагностика не требуется, хотя программа плохо сформирована, поэтому GCC соответствует. Это 14.6/7 в С++ 03 и 14.6/8 в С++ 11:
Если для определения шаблона не может быть создана действительная специализация, и этот шаблон не создается, определение шаблона плохо сформирован, не требуется диагностика.