Czytałem rozdział poświęcony wcieleniom księgi Rdza i natknąłem się na ten przykład dla nazwanego / jawnego życia:
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
Jest dla mnie jasne, że błąd jest uniemożliwiony przez kompilator jest stosowanie po zwolnieniu odniesienia przypisane do x
: po zakres wewnętrzna jest wykonywana, f
a zatem &f.x
stają się nieważne i nie powinny być przypisane dox
.
Moim problemem jest to, że problem można było łatwo przeanalizować bez użycia jawnego 'a
okresu istnienia, na przykład poprzez nielegalne przypisanie odwołania do szerszego zakresu (x = &f.x;
).
W jakich przypadkach rzeczywiście potrzebne są jawne czasy życia, aby zapobiec błędom użytkowania po zwolnieniu (lub innej klasie?)?