当编译为C ++ 98或C ++ 11时,gcc-4.9.2和clang-3.8都接受以下内容,
#include <cstdio>
template <typename T> void f(T) { printf("T\n"); }
template <> void f<int>(int) { printf("int\n"); } // explicit specialization
template <> void f<>(double) { printf("double\n"); } // explicit specialization -- 14.7.2(7)
template <> void f(float) { printf("float\n"); } // HERE
int main() {
f(1L); // T
f(10); // int
f(10.0); // double
f(10.0F); // float
}
我看到在C ++ 11标准§14.7.2(7)中允许在显式模板特化中推导出尾随模板参数,但我无法找到是否或如何允许标记为HERE
的terser表单。
这些编译器是否符合要求,或者这是一些扩展吗?
答案 0 :(得分:3)
C ++ 14标准§14.7(3)有
可以为函数模板,类模板,类模板的成员或成员模板声明显式特化。模板&lt;&gt;引入了明确的专业化声明。在类模板的显式特化声明,类模板的成员或类成员模板中,显式专用的类的名称应为simple-template-id。在函数模板或成员函数模板的显式特化声明中,显式专用的函数或成员函数的名称可以是模板ID。
然后演示
template<class U> void g(U) { } template<> void g(char) { } //specialize for U == char // U is deduced from the parameter type
然后我们有§14.7.3(10)
可以在template-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>&);
-end example]