A future describes a result state
A future can represent a result or an exception that becomes available later. Unlike manually sharing result flags, it packages readiness and exception delivery in a shared state; it does not specify your queue or resource budget. Calling get may wait and then consumes the future's result. Readiness and cancellation are separate contracts: a timed wait returning not-ready does not stop the operation.
std::async without an explicit policy may choose deferred execution. With launch::async it launches as specified, but a loop that creates one async operation per asset is not a bounded executor. Use the batch reference for admission control; use a single future example to understand result ownership.
A future associated with std::async can also block during the relevant shared-state release, including destruction in common last-owner cases. Discarding a temporary future is not a reliable fire-and-forget pattern. The exact call and launch policy belong in your lifetime review.
