Clang bug?使用指针作为模板参数



我想使用指针作为模板参数。一般来说,这很好用。但更进一步,我希望通过另一个模板类来声明这些指针。

我在GCC上做得很好,但在Clang上却失败了。

这里有一个小程序来演示(实时链接(:

template <size_t ID = 0>
struct PointerHolderT {
static thread_local char *smt_pStorage;
};
template <size_t ID>
thread_local char *PointerHolderT<ID>::smt_pStorage = nullptr;
template<char **ppData>
struct MyClass {
static void foo() {
cout << "this is my ptr: " << ppData << endl;
}
};
int main() {
MyClass<&PointerHolderT<123>::smt_pStorage>::foo(); 
return 0;
}

错误为:

error: non-type template argument of type 'char **' is not a constant expression

正如您从实时链接中更全面的示例中看到的那样,当clang是一个普通的全局指针时,以及当它是一个纯结构内的指针时,clang都能很好地处理它。只有当在模板化结构中使用指针时,它才会出现问题。

  • 这是一个叮当作响的bug吗?
    • 或者我所做的是非法的,但GCC允许这样做
  • 有人知道解决办法吗,这样我就可以在clang上完成这项工作了

我想问题出在thread_local上。如果我也将thread_local添加到pData中,它将无法编译。

最新更新