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

时间:2016-06-17 10:46:08

标签: 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;
}

这段代码可以很好地编译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中的错误吗?如果没有,在哪种情况下不抛出错误是有道理的?

1 个答案:

答案 0 :(得分:3)

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

  

<{1}}以外的存储类说明符不得在显式特化(14.7.3)或显式实例化(14.7.2)指令中指定。