Here's an example of something I found rather unexpected
pub trait HasItem {
type Item;
fn get_item(&self) -> &Self::Item;
}
impl<T, R> HasItem for R
where
T: HasItem,
R: std::ops::Deref<Target = T>
{
type Item = T::Item;
fn get_item(&self) -> &Self::Item {
self.deref().get_item()
}
}
This fails to compile, claiming that T doesn't live long enough.
My understanding is that these traits/impls get desugared to:
pub trait HasItem {
type Item;
fn get_item<'a>(&'a self) -> &'a Self::Item;
}
impl<T, R> HasItem for R
where
T: HasItem,
R: std::ops::Deref<Target = T>
{
type Item = T::Item;
fn get_item<'a>(&'a self) -> &'a Self::Item {
self.deref().get_item()
}
}
My question is, in what cases may a R
be able to return a reference to a T
where T
wouldn't live as long as a reference to R
?