Шаблон не нормальная вещь.Он не может быть скомпилирован как один, так как C ++ не имеет (и, вероятно, никогда не будет) никакой значимой концепции шаблона в качестве интерфейса и статического контракта между вызывающей и вызываемой сторонами, как «прямое объявление» для функции.Представьте себе мир, в котором любая функция на самом деле является макросом (почти как ужасный стиль #define
, но не настолько плохо себя ведет) и должна быть расширена для проверки типа.Это почти то, что шаблоны.
Это также то, что делает шаблоны настолько мощными!Шаблоны образуют полный язык Тьюринга, поскольку создание экземпляров шаблонов может произойти.Это ужасный язык, поэтому constexpr
был изобретен, чтобы иметь чистый язык для рекурсивных выражений времени компиляции без рекурсивных шаблонов.
Вы можете рассуждать только в терминах создания шаблонов.«Подпись» ничего вам не говорит. Подобно чистому lisp-подобному макросам, шаблоны никогда не компилируются должным образом по отдельности, даже с «экспортным шаблоном» , который требует повторного запуска компилятора после компоновки.
Кстати, идеяинсинуация одного члена комитета по стандарту C ++, что «шаблон экспорта» был продан экспертам C ++ как отдельная компиляция для шаблонов, как если бы они были обычными не встроенными функциями, это обман;ни один эксперт C ++ никогда не верил этому.