Significado de los símbolos ampersand '&' y star '*' en Rust

A pesar de leer detenidamente la documentación, estoy bastante confundido sobre el significado de& y* símbolo en Rust, y más generalmente sobre qué es exactamente una referencia de Rust.

En este ejemplo, parece ser similar a una referencia de C ++ (es decir, una dirección que se desreferencia automáticamente cuando se usa):

fn main() {
    let c: i32 = 5;
    let rc = &c;
    let next = rc + 1;
    println!("{}", next); // 6
}

Sin embargo, el siguiente código funciona exactamente igual:

fn main() {
    let c: i32 = 5;
    let rc = &c;
    let next = *rc + 1;
    println!("{}", next); // 6
}

Utilizando* desreferenciar una referencia no sería correcta en C ++. Entonces me gustaría entender por qué esto es correcto en Rust.

Mi comprensión hasta ahora, es que, insertando* frente a una referencia de Rust lo desreferencia, pero el* se inserta implícitamente de todos modos, por lo que no necesita agregarlo (mientras que en C ++, se inserta implícitamente y si lo inserta obtendrá un error de compilación).

Sin embargo, algo como esto no se compila:

fn main() {
    let mut c: i32 = 5;
    let mut next: i32 = 0;
    {
        let rc = &mut c;
        next = rc + 1;
    }
    println!("{}", next);
}
error[E0369]: binary operation `+` cannot be applied to type `&mut i32`
 --> src/main.rs:6:16
  |
6 |         next = rc + 1;
  |                ^^^^^^
  |
  = note: this is a reference to a type that `+` can be applied to; you need to dereference this variable once for this operation to work
  = note: an implementation of `std::ops::Add` might be missing for `&mut i32`

Pero esto funciona:

fn main() {
    let mut c: i32 = 5;
    let mut next: i32 = 0;
    {
        let rc = &mut c;
        next = *rc + 1;
    }
    println!("{}", next);  // 6
}

Parece que la desreferenciación implícita (a la C ++) es correcta para referencias inmutables, pero no para referencias mutables. ¿Por qué es esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta