“Modèle ” vs “modèle” sans crochets – quelle est la différence?

Supposons que j’ai déclaré:

template  void foo(T& t); 

Maintenant, quelle est la différence entre

 template  void foo(int& t); 

et

 template void foo(int& t); 

sémantiquement? Et est-ce que template-with-no-crochets et template-with-empty-crochets ont d’autres sémantiques dans d’autres contextes?


Lié à: Comment forcer une instance particulière d’un modèle C ++ à être instanciée?

template <> void foo(int& t); déclare une spécialisation du modèle, avec un corps potentiellement différent.

template void foo(int& t); provoque une instanciation explicite du modèle, mais n’introduit pas de spécialisation. Il force simplement l’instanciation du modèle pour un type spécifique.

Avec class / struct,

 template  struct foo {}; 

Voici une spécialisation:

 template <> struct foo{}; 

Voici une instanciation explicite:

 template struct foo;