Assuming the question is about storing differentasync fn's in a Vec (and honestly, storing copies of the same function would be fairly nonsensical), something like an impl Trait opaque type won’t work, because different async fn return different future types. You need a trait object, and owned trait objects need to be boxed. The main reason why a closure is involved in all the code examples in my other answers then is mainly because you need to transform the async fn which is fn(…) -> SomeFutureType to fn(…) -> Box<dyn Future<…> +…>; these “adapter closures” introduce the additional boxing step (and also the unsize coercion) to create a boxed trait object.