To be a bit more specific, from the point a Rust future is first polled, it is allowed to contain references to itself. (This is because the future is essentially a stack frame, and stack frames can contain pointers to other values on the stack frame.)
However, a self-referential value cannot be moved, because those pointers would still point to its old location. This means a future must be moved to its final location in memory before it begins execution.
The problem, then, is that a launch { .. } construct would have to be the thing responsible for selecting the future’s final location. If every individual future were always heap-allocated, this would be fine- launch could do the allocation and all would be well. In fact, this is how C++ coroutines work.
But in Rust, we don’t want every individual future to be a separate allocation- while top-level futures will usually be heap-allocated, sub-futures should be stored directly in their parent futures. And in #![no_std] applications, top-level futures will be stored somewhere other than the heap.
So while I do like the way Kotlin handles things with launch and async, I don’t see how that could be made to work in Rust without losing out on the ability to a) borrow local variables in async fns, or b) combine a whole tree of futures into a single allocation.