GCC Bug Party seems to be tonight :-)
Jokes aside, this is definitely a mistake . My answer to a related question does contain evidence, but since it is not underlined, I will repeat it here.
Thus, an INVOKE object, from the point of view of which the behavior of the constructor std::thread (see the related answer) is defined in the C ++ 11 standard
Define INVOKE (f, t1, t2, ..., tN) as follows:
- (t1. * f) (t2, ..., tN) when f is a pointer to a member function of class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of type obtained from T;
- ((* t1). * f) (t2, ..., tN) when f is a pointer to a member function of the class T and t1 is not one of the types described in the previous paragraph;
- t1. * f, when N == 1 and f is a pointer to the data of an element of class T, and t1 is an object of type T or a reference to an object of type T or a reference to an object of type obtained from T;
- (* t1). * f, when N == 1 and f is a pointer to the data of a member of the class T and t1 is not one of the types described in the previous paragraph;
- f (t1, t2, ..., tN) in all other cases.
A bold sentence effectively indicates that the line:
std :: thread t (& S :: f, s);
Must compile. Therefore, this is considered a mistake .
In addition, it does string compilation on GCC 4.8.0 (beta) and Clang 3.2.