Will this integrate with existing code that uses Pin<T>? If not this will split the ecosystem even further...
I would highlight that there are many cases where you CAN move an object safely until a certain operation requires the object to "stay put" in place.
Pin allows for that by tying the object to the place only when required. That's why Pin relates to both the object and the place.
Meanwhile, !Move types can't ever move. The object has to remain in the inital place it was constructed in. !Move requires in-place construction and emplacement to be ergonomic at all.
You could model this with a state machine enum where the "stay put" phase is a variant that accepts a !Move, like so:
enum StateMachine<PinnedState: ?Move> {
InitialState,
State1(String),
State2(Box<PinnedState>),
TerminalState,
}That way you could pass around IntoFutures without being affected by auto traits leaking. Only when you actually call .await() or .poll() would the immovable Future materialize.
But I also suspect there are important differences between `!Move` and `Unpin` that I'm not sure about.