针对‘template<typename T> void foo(T)’,‘template <> void foo(int)’是特化、重载或bug?
问题解答
这既不是函数重载,也不是编译bug,它是函数模板显式特化的合法简化写法。
C++标准规定,当函数模板的显式特化可以通过函数参数完全推导出模板实参时,允许省略函数名后的模板实参列表(也就是<>里的内容)。
举个例子:
原函数模板是:
template <typename T> void foo(T) {}
你写的template <> void foo(int) {},编译器能通过函数参数int直接推导出特化的模板参数为int,所以它和标准写法template <> void foo<int>(int) {}完全等价。
和函数重载的区别
如果直接定义void foo(int) {}(不带template <>),这才是函数重载——它是一个独立的非模板函数,优先级比原模板和特化模板都高。而你写的带template <>的版本必须依赖原函数模板存在,没有原模板的话这个代码会编译报错,本质还是模板特化,不是重载。
验证方式
如果尝试脱离原模板单独写template <> void foo(int) {},编译器会提示找不到对应的主模板,这也能证明它是特化而非重载或bug。
内容的提问来源于stack exchange,提问作者BadUsername
相关产品推荐
相关产品推荐

