title: Passing object by reference to std::thread in C++11
body: <p>Why can't you pass an object by reference when creating a <code>std::thread</code> ?</p>
  
  <p>For example the following snippit gives a compile error:</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;thread&gt;
  
  using namespace std;
  
  static void SimpleThread(int&amp; a)  // compile error
  //static void SimpleThread(int a)     // OK
  {
      cout &lt;&lt; __PRETTY_FUNCTION__ &lt;&lt; ":" &lt;&lt; a &lt;&lt; endl;
  }
  
  int main()
  {
      int a = 6;
  
      auto thread1 = std::thread(SimpleThread, a);
  
      thread1.join();
      return 0;
  }
  </code></pre>
  
  <p>Error:</p>
  
  <pre><code>In file included from /usr/include/c++/4.8/thread:39:0,
                   from ./std_thread_refs.cpp:5:
  /usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple&lt;void (*(int))(int&amp;)&gt;’:
  /usr/include/c++/4.8/thread:137:47:   required from ‘std::thread::thread(_Callable&amp;&amp;, _Args&amp;&amp; ...) [with _Callable = void (&amp;)(int&amp;); _Args = {int&amp;}]’
  ./std_thread_refs.cpp:19:47:   required from here
  /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of&lt;void (*(int))(int&amp;)&gt;’
         typedef typename result_of&lt;_Callable(_Args...)&gt;::type result_type;
                                                               ^
  /usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of&lt;void (*(int))(int&amp;)&gt;’
           _M_invoke(_Index_tuple&lt;_Indices...&gt;)
           ^
  </code></pre>
  
  <p>I've changed to passing a pointer, but is there a better work around?</p>