显式模板特化的语法

时间:2015-09-25 18:41:14

标签: c++ language-lawyer

当编译为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表单。

这些编译器是否符合要求,或者这是一些扩展吗?

1 个答案:

答案 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]