Несмотря на тщательное чтение документации, я довольно запутался в значении символа &
и *
в Rust, и в более общем плане о том, что именно является ссылкой Rust.
В этом примере это похоже на ссылку С++ (то есть адрес, который автоматически разыменовывается при использовании):
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
}
Использование *
для разыменования ссылки не будет корректным в С++. Поэтому я хотел бы понять, почему это правильно в Rust.
До сих пор я понимаю, что вставка *
перед ссылкой Rust вызывает его разбор, но *
неявно вставлена, так что вам не нужно ее добавлять (в то время как на С++ она неявно вставлена и если вы вставляете его, вы получаете ошибку компиляции).
Однако, что-то вроде этого не компилируется:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = rc + 1;
}
println!("{}", next);
}
<anon>:6:16: 6:18 error: binary operation `+` cannot be applied to type `&mut i32` [E0369]
<anon>:6 next = rc + 1;
^~
<anon>:6:16: 6:18 help: see the detailed explanation for E0369
<anon>:6:16: 6:18 note: an implementation of `std::ops::Add` might be missing for `&mut i32`
<anon>:6 next = rc + 1;
Но это работает:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
Кажется, что неявное разыменование (a la С++) верно для неизменяемых ссылок, но не для изменяемых ссылок. Почему это?