Rust编译报错:临时值被提前释放,不知产生位置及原因
Rust临时值生命周期报错解析
问题代码
pub trait GetIter<'a> { type IntoIter: IntoIterator<Item = usize>; fn get_iter(&'a self) -> Self::IntoIter; } pub struct NoRef<T> { inner: T, } impl<'a, T: 'a> GetIter<'a> for NoRef<T> where &'a T: GetIter<'a>, { type IntoIter = Vec<usize>; fn get_iter(&'a self) -> Vec<usize> { (&self.inner).get_iter(); vec![] } }
编译报错
error[E0716]: temporary value dropped while borrowed --> src/lib.rs:16:9 | 10 | impl<'a, T: 'a> GetIter<'a> for NoRef<T> | -- lifetime `'a` defined here ... 16 | (&self.inner).get_iter(); | ^^^^^^^^^^^^^------------ temporary value is freed at the end of this statement | | | creates a temporary value which is freed while still in use | argument requires that borrow lasts for `'a`
疑问
我无法理解报错中所指的「临时值」具体是什么?
解析与修复
临时值的本质
报错里的临时值就是(&self.inner)这个表达式生成的临时借用指针。
当你直接写(&self.inner).get_iter()时,这个借用指针的生命周期默认只覆盖当前语句:调用完get_iter()后,这个指针就会被立即销毁。但你的代码要求get_iter接收的是生命周期为'a的引用(和self的生命周期一致),临时指针的生命周期远短于'a,因此编译器判定它在还需要被使用的时候就被释放了,触发报错。
修复方案
你需要明确把借用的生命周期绑定到'a上,有两种简单方式:
- 将借用赋值给带明确生命周期的变量:
fn get_iter(&'a self) -> Vec<usize> { let inner_ref: &'a T = &self.inner; inner_ref.get_iter(); vec![] }
- 直接给借用标注生命周期:
fn get_iter(&'a self) -> Vec<usize> { (&'a self.inner).get_iter(); vec![] }
两种方式都能让编译器识别出这个借用的生命周期是'a,满足GetIter<'a>的约束,从而解决报错。
内容的提问来源于stack exchange,提问作者soupybionics
相关产品推荐
相关产品推荐

