1

是吗

template <typename T>
void foo(T) {}

template <>
void foo(int) {}

显式特化或函数重载,对于显式初始化编译器想看下面的代码吗?

template <typename T>
void foo(T) {}

template <>
void foo<int>(int) {}

我认为该标准接受这两个:

ISO/IEC 14882:2011

14.7.3 Explicit specialization [temp.expl.spec]

1 ...

can be declared by a declaration introduced by template<>; that is:
explicit-specialization:
template < > declaration
4

1 回答 1

2

任何一个都是允许的。在专业化

template <>
void foo(int) {}

T = int编译器从函数参数推断模板参数。从 14.7.3p10 开始:

如果可以从函数参数类型推导出来,则可以在命名显式函数模板特化的模板 ID中未指定尾随模板参数。

给出的示例涉及从类模板中进行推导,但它同样适用于从直接使用的类型中进行推导:

template<class T> class Array { /∗ ... ∗/ };
template<class T> void sort(Array<T>& v);
// explicit specialization for sort(Array<int>&)
// with deduced template-argument of type int
template<> void sort(Array<int>&);
于 2012-11-23T20:17:34.873 回答