struct Iter<'a, T> {
    slice: &'a [T],
}
impl<'a, T> Iterator for Iter<'a, T> {
    type Item = &'a T;
    fn next(&mut self) -> Option<Self::Item> {
        self.slice.get(0) // works
    }
}
struct MutIter<'a, T> {
    slice: &'a mut [T],
}
impl<'a, T> Iterator for MutIter<'a, T> {
    type Item = &'a mut T;
    fn next(&mut self) -> Option<Self::Item> {
        self.slice.get_mut(0) // fails
    }
}
fn main() {
    println!("Hello, world!");
}
error: lifetime may not live long enough
  --> src/main.rs:21:9
   |
17 | impl<'a, T> Iterator for MutIter<'a, T> {
   |      -- lifetime `'a` defined here
...
20 |     fn next(&mut self) -> Option<Self::Item> {
   |             - let's call the lifetime of this reference `'1`
21 |         self.slice.get_mut(0) // fails
   |         ^^^^^^^^^^^^^^^^^^^^^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
you can see that similar line with shared reference works.
see lines with comments // works and // fails in the above code snippet