Suppose you have some struct which holds some references inside. Now, you want to store a reference to this structure inside some larger struct. It could look like this:

1 2 3 4 5 6 7 struct Foo < 'a > { buff : & 'a String } struct Context < 'f > { foo : & 'f Foo }

The code, as written, does not compile:

error[E0106]: missing lifetime specifier --> src/main.rs:8:14 | 8 | foo: &'f Foo | ^^^ expected lifetime parameter

To fix it, we need to get Foo an additional lifetime:

1 2 3 4 5 6 7 struct Foo < 'a > { buff : & 'a String } struct Context < 'f , 'a : 'f > { foo : & 'f Foo < 'a > }

And this is the problem which is the subject of this post. Although Foo is supposed to be an implementation detail, its lifetime, 'a , bleeds to Context 's interface, so most of the clients of Context would need to name this lifetime together with 'a: 'f bound. Note that this effect is transitive: in general, rust struct has to name lifetimes of contained types, and their contained types, and their contained types, …​ But let’s concentrate on this two-level example!