fed*_*ino 7 c++ templates language-lawyer function-templates storage-class-specifier
请考虑以下代码段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以很好地编译g ++和clang.非常好.现在添加static到模板函数专门化:
template<>
constexpr static int f<0>() { return 1; }
Run Code Online (Sandbox Code Playgroud)
然后g ++ 6.1对错误做出反应:
11:错误:显式模板专业化不能有存储类
和clang 3.8:
11:错误:显式特化具有无关的,不一致的存储类'静态'
他们看起来像是一致的.再好不过.现在,添加static关键字也是模板功能的一般情况:
g ++ 6.1:
11:错误:显式模板专业化不能有存储类
clang 3.8编译并发出警告:
11:警告:显式专业化不能有存储类
和clang结果返回正确的答案.
这是clang中的错误吗?如果没有,在哪种情况下不抛出错误是有道理的?