constexpr静态模板函数:g ++错误是对clang的警告

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中的错误吗?如果没有,在哪种情况下不抛出错误是有道理的?

Col*_*mbo 4

它就像[dcl.stc]/1一样简单(可以追溯到 C++98):

不得在显式专业化 (14.7.3) 或显式实例化 (14.7.2) 指令中指定除 以外的存储类说明符。thread_local