请考虑以下代码段:
#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:错误:显式专业化具有无关的,不一致的存储类&#39;静态&#39;
他们看似同意。再好不过。
现在,添加static
关键字也是模板函数的一般情况:
g ++ 6.1:
11:错误:显式模板专业化不能有存储类
clang 3.8编译并发出警告:
11:警告:显式专业化不能有存储类
和clang结果会返回正确答案。
这是clang中的错误吗?如果没有,在哪种情况下不抛出错误是有道理的?
答案 0 :(得分:3)
它就像[dcl.stc]/1一样简单(可以追溯到C ++ 98):
<{1}}以外的存储类说明符不得在显式特化(14.7.3)或显式实例化(14.7.2)指令中指定。