C++14 警告:变量的模板 headers 太多(应为 0)

C++14 warning: too many template headers for variable (should be 0)

在试验最近的 g++-5 编译器时,我在文件中写了以下语句:

template<T> T a;
template<> int a = 1;

这导致:

warning: too many template headers for a (should be 0)

同样有效,它并没有真正专门化 a<int>。例如

template<typename T> T a;
template<> int a = 1;

int main ()  {
  std::cout << a<double> << "\n";  // prints 0; OK
  std::cout << a<int> << "\n";  // prints 0! why not 1?
}

这个语法有什么奥秘?

模板参数只能在函数模板的显式特化中省略。你有一个变量模板,所以你必须包含 <int>:

template<> int a<int> = 1;

引用 C++14 (n4140)、14.7.3/10(强调我的):

A trailing template-argument can be left unspecified in the template-id naming an explicit function template specialization provided it can be deduced from the function argument type.

如果不想重复类型,可以使用auto:

template<> auto a<int> = 1;

[Live example] 使用 Clang。

有一点需要牢记:当使用 auto 时,专用变量的类型将从初始化程序中推导出来,而不是从模板参数中推导出来。由于特化可以具有与主模板不同的类型,即使它们不同,编译器也会很乐意接受它。