Rust对临时值的引用不报错

4
我有以下的代码:
#[derive(Debug)]
pub enum List<'a> {
    Nil,
    Cons(i32, &'a List<'a>)
}

{
    let x = Cons(1, &Cons(2, &Nil));
    println!("{:?}", x);
}

它工作得很好。我不明白为什么这段代码没有报错,Cons(2, &Nil) 在构造Cons(1, _)之前难道不会被删除吗?
此外,当我为List添加一个空的impl Drop后,上述代码就无法工作了。
impl<'a> Drop for List<'a> {
    fn drop(&mut self) {

    }
}

它报告了错误,即borrowed value does not live long enough适用于Cons(2, _)Nil

为什么在添加impl Drop之前和之后会有这样的差异?

1个回答

3

Cons(2, &Nil)在构建Cons(1, _)之前被丢弃了吗?

如果将引用绑定到临时变量,Rust会根据需要扩展临时变量的生命周期以供绑定使用;有关详细信息,请参见此答案

为什么添加impl Drop之前和之后会有这样的差异?

请参见此评论。临时变量的扩展生命周期与您示例中x的生命周期匹配。当包含引用的struct没有Drop实现时,

具有相同生命周期的引用和referent是允许的:引用不能不安全地使用。将Drop实现引入到情况中需要确保referent 严格超过引用,以确保按照特定顺序运行drop方法。


第一个问题的答案是不正确的。在给定的上下文中没有寿命扩展。然而这仍旧有效的原因是常量提升——Nil被提升为一个静态常量,因此引用具有静态寿命期。 - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接