You may want to refer to this blog post. TL;DR: In editions before 2024, -> impl Trait
outside of traits only capture lifetimes that are mentioned in the return. In edition 2024, they'll always capture lifetimes, unless you opt out via precise capturing. So in edition 2024 -- which drops in about a week -- the answer to your OP is "you don't need to specify the lifetime".
Whether the lifetime is captured or not changes how borrow checking works. See this thread for an example of that being an issue.[1]
In many ways you have the freedom to change the implementation without breaking downstream so long as you don't change the signature. However, opaque return types leak auto-traits like Send
and Sync
. If your changes causes the return to lose an auto-trait, that's a breaking change.
(Downstream can also figure out other things about your return type, such as its size, alignment, and even TypeId
when 'static
. But it's generally not considered breaking to change these things.)
That particular example is for an opaque return in a trait, which always captures lifetimes (on all editions) and doesn't yet support precise capturing. ↩︎