struct Data<'a>
{
re:&'a int,
}
fn main() {
let d1 = 0;
let mut s2 = Data{re:&d1};
{
let d2 = 0;
s2.re = &d2;
println!("{}",s2.re);
}
//println!("{}",s2.re);
}
上面结构体Data的定义不是要求成员re的存活周期不短于Data实例的存活周期吗?
为什么可以给s2的re赋值为d2的引用呢?
1
共 2 条评论, 1 页
评论区
写评论对以下内容的回复:
也就是说,上面的d2虽然是在一个小的作用域中,但drop checker发现这个作用域下面没有可能访问到d2的代码,因此就认为满足了生命周期要求。
如果取消注释最后一行
println!("{}",s2.re);
,就会因为访问了s2,drop checker无法确定是不是内部访问了re,所以就“精确化”了d2的生命周期,所以产生编译错误。我的理解: 如果你省略最后一句,这个就关系到drop checker了,drop checker会强制re的生命周期至少不短于s2,你可以去看看drop checker的解释。我个人觉得这个确实反直觉。 drop checker:https://doc.rust-lang.org/nomicon/dropck.html