One concern I've always had with
!Move
proposals is that in many cases, "immovable" values can —and often must —be moved at some point. For example, a self-referential future may be moved into an executor spawn function before being polled. ThePin
model handles this quite elegantly.
I don't want to derail the thread, but generally speaking, !Move
should be paired with some form of in-place construction. That could be in the form of "placement by return" or something more explicit. In-place construction is a highly-requested feature even for movable structs because of its performance benefits. But with !Move
, such a feature would be necessary in order to construct things that should never move at all. This should also generally be sufficient for futures.
(Or if in-place Future construction isn't enough and you really need to move them, then the design could be combined with the recent "async
is IntoFuture
, not Future
" proposal: the IntoFuture
object could be movable while the Future
object is not. Admittedly, backwards compatibility would make this way, way more complicated. Broadly speaking, backwards compatibility with the existing async ecosystem is the hardest part of any !Move
proposal; I'd like to believe it's solvable, but it won't be pretty.)