シンプルにいうと以下の式で作られる Future が !Unpin だから
let f = async { ... };async ブロックの中では、値が await を挟んで普通に参照されたりするだろう。 つまり、参照と値がそれぞれ別の Future に属していて Future がツリー状につながっているような状態が普通である。 普通の Rust のコードだと参照されているとコンパイラが move させてくれないが、 async ブロックでできた Future が move できてしまうとその制約が破壊されてしまう。
その前提で Future の AndThen を実現する Future や All や Any を実現するコンビネータのような Future を実装することを考えてみる。
それは当然 Future を持つ Future となり、もし async ブロックから作られた Future を持てば move できてしまうとまずい(&mut 参照できないものになる)。だから全ての Future は poll で Pin<&mut Self> しとかないといけない。
外部 Future を組み合わせるような Future を作らない人には関係ない制約と認識している。