< 返回版块

79nos 发表于 2019-06-29 10:52

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的引用呢?

评论区

写评论
作者 79nos 2019-07-01 10:31

对以下内容的回复:

也就是说,上面的d2虽然是在一个小的作用域中,但drop checker发现这个作用域下面没有可能访问到d2的代码,因此就认为满足了生命周期要求。

如果取消注释最后一行println!("{}",s2.re);,就会因为访问了s2,drop checker无法确定是不是内部访问了re,所以就“精确化”了d2的生命周期,所以产生编译错误。

Dengjianping 2019-06-29 20:54

我的理解: 如果你省略最后一句,这个就关系到drop checker了,drop checker会强制re的生命周期至少不短于s2,你可以去看看drop checker的解释。我个人觉得这个确实反直觉。 drop checker:https://doc.rust-lang.org/nomicon/dropck.html

1 共 2 条评论, 1 页