8

考虑以下代码段:

#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在模板函数一般情况下添加关键字:

g++ 6.1:

11:错误:显式模板特化不能有存储类

clang 3.8 编译时出现警告:

11:警告:显式特化不能有存储类

并且铿锵的结果返回正确的答案。

这是clang中的错误吗?如果不是,在哪种情况下不抛出错误有意义?

4

1 回答 1

4

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

不应在显式特化 (14.7.3) 或显式实例化 (14.7.2) 指令中指定除存储类说明符之外的存储类说明符。thread_local

于 2016-06-17T13:16:09.743 回答