Rust の borrow checker / type checker の挙動を理解していないことを理解した。
let mut x = 0;
let ref_x_0 = &mut x;
let ref_x_1 = &mut x; // compile error.
これは二つ目の参照を取ろうとした時点でコンパイルエラー。
let mut x = 0;
let ref_x = &mut x;
let ref_ref_x = &x;
**ref_ref_x = 1; // compile error.
これは dereference しようとしたところでコンパイルエラー。 C++ と違って **(&&mut x)
がエラーになるべきなのは分かるが、型として &&mut T
が &&T
になるわけではないのだよな。