首页 > 解决方案 > 在具有相同生命周期的嵌套引用的情况下,借用检查器的逻辑到底是什么?

问题描述

fn f<'a>(_: &'a mut &'a u8) {}

fn main() {
    let mut data = &1;
    {
        let tmp_mut = &mut data;
        f(tmp_mut);
    }
    println!("{:p}", data);
}

操场

error[E0502]: cannot borrow `data` as immutable because it is also borrowed as mutable
  --> src/main.rs:11:22
   |
8  |         let tmp_mut = &mut data;
   |                            ---- mutable borrow occurs here
...
11 |     println!("{:p}", data);
   |                      ^^^^ immutable borrow occurs here
12 | }
   | - mutable borrow ends here

可以通过不在函数签名中使用相同的生命周期(只需 leave fn f(_: &mut &u8) {})来修复此代码,但这里到底发生了什么?

错误消息看起来有点奇怪 -tmp_mut试图比声明它的块更有效似乎违反直觉。我希望错误消息抱怨不可能的生命周期要求,而不是唯一性错误。

标签: rustlifetimeborrow-checker

解决方案


推荐阅读