Date
2013-10-02.00:00:00
Message id
4646

Content

According to 9.2.2 [dcl.stc] paragraph 1,

...If thread_local appears in any declaration of a variable it shall be present in all declarations of that entity... A storage-class-specifier shall not be specified in an explicit specialization (13.9.4 [temp.expl.spec]) or an explicit instantiation (13.9.3 [temp.explicit]) directive.

These two requirements appear to be in conflict when an explicit instantiation or explicit specialization names a thread_local variable. For example,

  template <class T> struct S {
    thread_local static int tlm;
  };
  template <> int S<int>::tlm = 0;
  template <> thread_local int S<float>::tlm = 0;

which of the two explicit specializations is correct?