You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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上,有两种简单方式:

  1. 将借用赋值给带明确生命周期的变量:
fn get_iter(&'a self) -> Vec<usize> {
    let inner_ref: &'a T = &self.inner;
    inner_ref.get_iter();
    vec![]
}
  1. 直接给借用标注生命周期:
fn get_iter(&'a self) -> Vec<usize> {
    (&'a self.inner).get_iter();
    vec![]
}

两种方式都能让编译器识别出这个借用的生命周期是'a,满足GetIter<'a>的约束,从而解决报错。


内容的提问来源于stack exchange,提问作者soupybionics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:28:11