| A reference has a longer lifetime than the data it references. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0491 |
| struct Foo<'a> { |
| x: fn(&'a i32), |
| } |
| |
| trait Trait<'a, 'b> { |
| type Out; |
| } |
| |
| impl<'a, 'b> Trait<'a, 'b> for usize { |
| type Out = &'a Foo<'b>; // error! |
| } |
| ``` |
| |
| Here, the problem is that the compiler cannot be sure that the `'b` lifetime |
| will live longer than `'a`, which should be mandatory in order to be sure that |
| `Trait::Out` will always have a reference pointing to an existing type. So in |
| this case, we just need to tell the compiler than `'b` must outlive `'a`: |
| |
| ``` |
| struct Foo<'a> { |
| x: fn(&'a i32), |
| } |
| |
| trait Trait<'a, 'b> { |
| type Out; |
| } |
| |
| impl<'a, 'b: 'a> Trait<'a, 'b> for usize { // we added the lifetime enforcement |
| type Out = &'a Foo<'b>; // it now works! |
| } |
| ``` |