"шаблон <>" против "шаблона" без скобок - какая разница?

Предположим, что я заявил:

template <typename T> void foo(T& t);

Теперь, в чем разница между

template <> void foo<int>(int& t);

и

template void foo<int>(int& t);

семантически? А в шаблонах с шаблонами без привязки и с шаблонами с пустым-скобками есть другая семантика в других контекстах?


Связано с: Как заставить экземпляр С++ создать экземпляр? Суб >

Ответ 1

template <> void foo<int>(int& t); объявляет специализацию шаблона с потенциально различным телом.

template void foo<int>(int& t); вызывает явное создание экземпляра шаблона, но не вводит специализацию. Он просто заставляет экземпляр шаблона для определенного типа.

Ответ 2

С классом /struct,

template <typename T> struct foo {};

Ниже приведена специализация:

template <> struct foo<int>{};

Ниже приведена явная инстанция:

template struct foo<int>;