Почему в Rust нужны явные времена жизни?
Я читалглава жизни книги Rust, и я наткнулся на этот пример для именованного / явного времени жизни:
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x; // -+ x goes into scope
// |
{ // |
let y = &5; // ---+ y goes into scope
let f = Foo { x: y }; // ---+ f goes into scope
x = &f.x; // | | error here
} // ---+ f and y go out of scope
// |
println!("{}", x); // |
} // -+ x goes out of scope
Мне совершенно ясно, что ошибка, предотвращаемая компилятором,использовать после освобождения ссылки, присвоеннойx
: после того, как внутренний объем сделан,f
и поэтому&f.x
стать недействительным и не должен был быть назначенx
.
Моя проблема в том, что проблема могла быть легко проанализированабез с использованиемявный 'a
время жизни, например, путем неверного присвоения ссылки в более широкой области (x = &f.x;
).
В каких случаях требуется явное время жизни для предотвращения ошибок использования после освобождения (или какого-либо другого класса?)?