title: Passing reference to object in callback function to std::thread
body: <p>I'm trying to do something like this:</p>
  
  <pre><code>void commands_conn_handler(int socket, RPiServer&amp; server) {
    // Not important code about handling connection
  }
  
  class RPiServer {
  public:
    void Accept(void Accept(void (*acceped_conn_handler)(int, RPiServer&amp;)) {
      // (...)
      int remote_socket = 0; // Doesn't matter - example.
      std::thread conn_handler_thread(acceped_conn_handler, remote_socket, *this);
      conn_handler_thread.join();
    }
  };
  
  int main() {
    RPiServer commands_server();
    commands_server.Accept(commands_conn_handler);
  }
  </code></pre>
  
  <p>And when I try to build this, there are some errors:</p>
  
  <blockquote>
    <p>In file included from /usr/include/c++/6/thread:39:0,
                     from src/rpi_server/rpiserver.cpp:11:
    /usr/include/c++/6/functional: In instantiation of ‘struct std::_Bind_simple’:
    /usr/include/c++/6/thread:138:26:   required from ‘std::thread::thread(_Callable&amp;&amp;, _Args&amp;&amp; ...) [with _Callable = void (*&amp;)(int, RPiServer&amp;); _Args = {int&amp;, RPiServer&amp;}]’
    src/rpi_server/rpiserver.cpp:89:79:   required from here
    /usr/include/c++/6/functional:1365:61: error: no type named ‘type’ in ‘class std::result_of’
           typedef typename result_of&lt;_Callable(_Args...)>::type result_type;
                                                                 ^~~~~~~~~~~
    /usr/include/c++/6/functional:1386:9: error: no type named ‘type’ in ‘class std::result_of’
             _M_invoke(_Index_tuple&lt;_Indices...>)
             ^~~~~~~~~
    Makefile:29: recipe for target 'build/rpi_server/rpiserver.o' failed</p>
  </blockquote>
  
  <p>When I change thread function in following way (remove reference to object):</p>
  
  <pre><code>void commands_conn_handler(int socket) {
    // Not important code about handling connection
  }
  
  class RPiServer {
  public:
    void Accept(void (*acceped_conn_handler)(int)) {
      // (...)
      int remote_socket = 0; // Doesn't matter - example.
      std::thread conn_handler_thread(acceped_conn_handler, remote_socket);
      conn_handler_thread.join();
    }
  };
  
  int main() {
    RPiServer commands_server();
    commands_server.Accept(commands_conn_handler);
  }
  </code></pre>
  
  <p>Everything builds perfectly fine. What I'm doing wrong when I'm passing reference as parameter to thread function?</p>