I frequently see this pattern in code, binding shared_from_this as the first parameter to a member function and dispatching the result using an async_*
It goes like this:
1) Boost.Bind documentation states:
"[Note: mem_fn creates function objects that are able to accept a pointer, a reference, or a smart pointer to an object as its first argument; for additional information, see the mem_fn documentation.]"
2) mem_fn documentation says:
When the function object is invoked with a first argument x that is neither a pointer nor a reference to the appropriate class (X in the example above), it uses get_pointer(x) to obtain a pointer from x. Library authors can "register" their smart pointer classes by supplying an appropriate get_pointer overload, allowing mem_fn to recognize and support them.
So, pointer or smart-pointer is stored in the binder as-is, until its invocation.