Why can’t I reuse a &mut reference after passing it to a function that accepts a generic type?

Normally, when you pass a mutable reference to a function, the compiler implicitly performs a reborrow. This produces a new borrow with a shorter lifetime.

When the parameter is generic (and is not of the form &mut T), the compiler doesn’t do this reborrowing automatically1. However, you can do it manually by dereferencing your existing mutable reference and then referencing it again:

fn take_reference(data: &mut Vec<u8>) {
    {
        let mut buf = io::Cursor::new(&mut *data);

        use_cursor(&mut buf);
    }

    data.len();
}

1 — This is because the current compiler architecture only allows a chance to do a coercion if both the source and target types are known at the coercion site.

Leave a Comment