"template<>" 与不带括号的 "template" - 有什么区别?

"template<>" vs "template" without brackets - what's the difference?

假设我已经声明:

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

现在,

有什么区别
template <> void foo<int>(int& t);

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

语义上?没有括号的模板和带有空括号的模板在其他上下文中是否具有其他语义?


相关: How do I force a particular instance of a C++ template to instantiate?

和class/struct,

template <typename T> struct foo {};

专业化如下:

template <> struct foo<int>{};

以下是显式实例化:

template struct foo<int>;

template <> void foo<int>(int& t); 声明模板的 专业化 ,主体可能不同。

template void foo<int>(int& t); 导致模板的 显式实例化 ,但不引入专门化。它只是强制实例化特定类型的模板。