質問1について分かりやすいのがforループだな
あるベクタをforループ中に、forの対象にしてるベクタそのものにpushするみたいな黒魔術操作を禁止するために
forループを回してる間は回す対象の配列にイミュータブル参照を作ってる状態にしてコンパイラにチェックさせる