考虑以下片段:
#include <iostream>
template <int I>
constexpr int f() { return I * f<I-1>(); }
template<>
constexpr int f<0>() { return 1; }
int main () {
std::cout << f<5>();
return 0;
}
此代码与G 和Clang均很好地编译。很不错。现在,将static
添加到模板功能专业化:
template<>
constexpr static int f<0>() { return 1; }
然后g 6.1反应错误:
11:错误:显式模板专业化不能有存储类
和clang 3.8也:
11:错误:明确的专业化具有无关的,不一致的存储类'static'
他们看起来同意。再次很好。现在,添加 static
关键字也是模板函数一般情况:
g 6.1:
11:错误:显式模板专业化不能有存储类
clang 3.8汇编带有警告:
11:警告:明确的专业化不能有存储类
和clang结果返回正确的答案。
这是clang中的错误吗?如果没有,在这种情况下,不丢失错误是有意义的?
它与[dcl.stc]/1一样简单(回到C 98):
a 储存级特定符除了
thread_local
以外,不得在显式专业化(14.7.3)或显式实例化(14.7.2)指令中指定。