Вот как объявлен конструктор конструктора std::thread (с использованием Visual Studio 2015):
template<class _Fn,
class... _Args,
class = typename enable_if<
!is_same<typename decay<_Fn>::type, thread>::value>::type>
explicit thread(_Fn&& _Fx, _Args&&... _Ax)
Нет вопросов относительно _Fn и _Args, однако, что третий class = ... меня полностью смущает. Что он делает, как он работает и для чего он нужен?