# rsinfuの意見 (MLに返信したやつ)
Sealed rangeの要素を読み出すと,必ずコピコンが走る.だから安いコピコンという前提は必須.
短くまとめるとそういう意見.以下はその説明でござんす.
## 問題はswapだけじゃない
過去ログだと,みんなswap操作とmoveについてばかり話してた.
でもこれ,swapだけの問題じゃないのに気づいてほしい.
あらゆる操作にコピーがつきまとうし,moveで解決できるケースも限られてる.
Swapするときに限らず,いかなる要素アクセスもコピコンを呼び出すのに注意!
例えば Array!BigInt をソートする場合,なんの気なしの要素比較ですらコピーを作ってしまう:
if (!less(r[i], r[p])) // ここでコピコンが2回走る.
コンテナ内とlessに渡すもので,論理的にオブジェクトが複数存在してるから,このコピコンは消去できない.
まあもちろん,moveで取り出してから比較し,そのあとで代入し直せばコピコンは防げる.
でもそんなのはヤダヤダ! あらゆる要素アクセスでそれをやるっての!?
たいていのシーンではただ要素を読みたいだけ.
swapのようにmoveで解決できるのはごく一部で,ほとんどはコピーせざるをえない.
Sealed rangeはそもそも要素を読むのにコピーをする (参照を見せない) というコンセプトなんだから,
もしそいつを推してくというのなら,「要素のコピコンは軽いもの」と仮定しないと身動きとれないですよ.
そんなわけで,moveFront等を追放し,代わりにコピコンは安いという前提を要請するのに賛成.