C++ 带有叮当声的模板线程初始值设定项

C++ 带有叮当声的模板线程初始值设定项,c++,gcc,clang,thread-local-storage,C++,Gcc,Clang,Thread Local Storage,我正在使用带有叮当声的\u线程 是的,我知道它不能随身携带。是的,我知道标准C++ >代码> thRead本地//COD>关键字。我意识到其中的差异。在这种情况下,我故意使用\uu线程 现在,对于Clang和G++,\uu thread关键字只能用于具有普通析构函数的POD类型 例如: struct Foo {}; __thread Foo f; 但是,在类型依赖于模板参数的情况下,Clang似乎禁止使用\uuuu thread,即使模板本身从未实例化(因此Clang甚至无法判断类型是否是一

我正在使用带有叮当声的
\u线程

是的,我知道它不能随身携带。是的,我知道标准C++ >代码> thRead本地//COD>关键字。我意识到其中的差异。在这种情况下,我故意使用
\uu线程

现在,对于Clang和G++,
\uu thread
关键字只能用于具有普通析构函数的POD类型

例如:

struct Foo {}; 
__thread Foo f;
但是,在类型依赖于模板参数的情况下,Clang似乎禁止使用
\uuuu thread
,即使模板本身从未实例化(因此Clang甚至无法判断类型是否是一个带有普通析构函数的POD)

例如,对于GCC 4.9.2,我可以说:

template <class T>
struct Bar { T data; };

template <class T>
struct Foo
{
    static __thread Bar<T> value;
};

template <class T>
__thread Bar<T> Foo<T>::value {};

Foo<int> f;

这可能是一个可行的解决办法,但我不确定这是否安全。我想确保线程本地值已初始化为零。文档似乎没有指定一个具有
\u thread
存储的对象是否必须初始化为零。如果它是
静态的
,我想应该是这样的,但我宁愿显式地指定一个初始值设定项。不幸的是,Clang不喜欢这样。

在这里看到同样的问题。看起来像个bug?在这里看到同样的问题。看起来像只虫子?
error: initializer for thread-local variable must be a constant expression
__thread Bar<T> Foo<T>::value {};
template <class T>
__thread Bar<T> Foo<T>::value;