Значение символов амперсанда '&' и звездочки '*' в Rust

Несмотря на тщательное чтение документации, я не совсем понимаю смысл& а также* символ в Rust, и в более общем смысле о том, что именно является ссылкой на Rust.

В этом примере это похоже на ссылку на C ++ (то есть на адрес, который автоматически разыменовывается при использовании):

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

Однако следующий код работает точно так же:

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

С помощью* разыменование ссылки не будет правильным в C ++. Поэтому я хотел бы понять, почему это правильно в Rust.

Мое понимание до сих пор, что, вставляя* перед ссылкой Rust разыменовывает его, но* в любом случае неявно вставляется, поэтому вам не нужно добавлять его (в то время как в C ++ он вставляется неявно, и если вы вставляете его, вы получаете ошибку компиляции).

Однако что-то вроде этого не компилируется:

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`

Но это работает:

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

Кажется, что неявное разыменование (в стиле C ++) является правильным для неизменяемых ссылок, но не для изменяемых ссылок. Почему это?

Ответы на вопрос(3)

Ваш ответ на вопрос