gpt4 book ai didi

Rust 对临时值的引用不报告错误

转载 作者:行者123 更新时间:2023-11-29 08:00:15 26 4
gpt4 key购买 nike

我有以下代码:

#[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) {

}
}

对于 Cons(2, _)Nil,它报告了 borrowed value does not live enough 的错误。

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

最佳答案

Isn't the Cons(2, &Nil) dropped before constructing Cons(1, _)?

如果您将引用绑定(bind)到临时对象,Rust 会根据绑定(bind)的需要延长临时对象的生命周期;见this answer了解详情。

Why is there such difference between before and after adding impl Drop?

参见 this comment .在您的示例中,临时对象的延长生命周期与 x 的生命周期相匹配。当包含引用的 struct 没有 Drop 实现时,

it’s permissible for reference and referent to have identical lifetimes: the reference can’t be used unsafely. Introducing a Drop impl to the situation requires the referent to strictly outlive the reference, to ensure there is a clear order in which to run drop methods.

关于Rust 对临时值的引用不报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52884893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com