This solution needs move constructors, so the request is transferred to the returned object. If not the destructor of the local variable will invoke wait() (relinquish doesn't help because the request copy returned will also be relinquished).
Otherwise the request needs to be allocated in the heap.