It works when Item is not 'static.
fn example<'s>(mut vec: &mut Vec<&'s str>) {
// `Item = &'s str`
process(|_| {}, |item| vec.push(*item));
}
Sometimes HRTBs -- F: for<'a> ... -- can end up requiring something to be 'static. But because &'a Item shows up in the inputs to the FnMut trait here, there's an implicit where Item: 'a constraint on the HRTB.
Is it enough for your actual use case? That I'm less sure about.
It works for local lifetimes too if that's what you meant.
let local = "Hi".to_owned();
let mut vec = vec![&*local];
process(|_| {}, |item| vec.push(*item));
It is possible to generalize over "taking something owned or taking something borrowed", but such approaches tend to not be fully generic or to wreck inference. They resemble the general shape that is presented in the "alternative to GATs" article.
Here's an example from awhile ago. I've wanted to revisit that and see if something from this comment could help with the inference challenges, but haven't got around to it.
If you have a specific set of types (or type constructors) that you wish Item could be, there may be a more targeted solution.