If you look at the documentation of async, the feature you want to emulate, it decays all the future template arguments. And it is effective as it works far better like this, as show here :
template <typename T_>
using decay_t = typename std::decay<T_>::type;
template< class T >
using result_of_t = typename std::result_of<T>::type;
template <typename F, typename A>
std::future<result_of_t<decay_t<F>(decay_t<A>)>> spawn_task(F &&f, A &&a) {
using result_t = result_of_t<decay_t<F>(decay_t<A>)>;
std::packaged_task< result_t(decay_t<A>)> task(std::forward<F>(f));
auto res = task.get_future();
std::thread t(std::move(task), std::forward<A>(a));
t.detach();
return res;
}