我正在阅读 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;”)。在哪些情况下需要显式生命周期才能防止使用后释放(或其他类)错误?