如何理解具有相同生命周期的不可变借用的可变借用?

How to understand a mutable borrow of an immutable borrow with the same lifetimes?

我很难理解这段代码:

fn main() {}

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

fn dp<'a>(mem: &'a mut &'a u8) {
    f(mem);
    f(mem);
}

错误消息说:

error[E0499]: cannot borrow `*mem` as mutable more than once at a time
 --> src/main.rs:7:7
  |
5 | fn dp<'a>(mem: &'a mut &'a u8) {
  |       -- lifetime `'a` defined here
6 |     f(mem);
  |     ------
  |     | |
  |     | first mutable borrow occurs here
  |     argument requires that `*mem` is borrowed for `'a`
7 |     f(mem);
  |       ^^^ second mutable borrow occurs here

我知道&'a mut &'a u8这件事不对,但为什么错误信息是这样的?

&mut TT 上是不变的。在这里,您的 T&u8。问题是内在和外在的生命周期是一样的。内部生命周期 'a 是“某个”生命周期,大于(或至少等同于)函数的持续时间 dp(),但由于它位于可变引用之后,因此无法缩短到函数的持续时间函数 f()(记住 &mut TT 上是不变的)。但是可变引用(外部)也是 'a,因此 *mem 将在首先调用 f()。因此第二次调用失败,因为 *mem 已经被借用了。您可以通过使用不同的(即不相交的)内部和外部生命周期来解决此问题。

您可以阅读有关方差和生命周期的更多信息here