Странное поведение вложенных мутабельных ссылок

Вот ответ который все объясняет.

Если бы эта функция работала:

fn deref_rm<'a,'b>(x: &'a &'b mut u8) -> &'b u8 {x}

То мы могли бы получить иммутабельную ссылку одновременно с мутабельной, что запрещено правилами заимствования.

Тут есть интересный момент - если задать время жизни внешней ссылки большим или равным времени жизни внутренней то функция будет компилироваться без ошибок:

fn deref_rm<'a:'b,'b>(x: &'a &'b mut u8) -> &'b u8 {x}

В данном случае внутренняя мутабельная ссылка иммутабельно заимствована все свое время жизни и ее нельзя использовать для изменения данных, на которые она ссылается. Вот пример, где мутабельная и иммутабельная ссылки легально существуют одновременно:

fn deref_rm<'a:'b,'b>(x: &'a &'b mut u8) -> &'b u8 {x}

fn main() {
    let mut data = 1u8;
    let mdata:&mut u8 = &mut data;
    let rdata:&u8 = deref_rm(&mdata); //let rdata:&u8 = &*mdata;
    println!("{}", rdata);
    println!("{}", mdata);
    //*mdata = 2u8; //cannot assign to `*mdata` because it is borrowed
}
2 лайка