## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Error code E0700

The `impl Trait` return type captures lifetime parameters that do not appear within the `impl Trait` itself.

Erroneous code example:

    #![allow(unused)]
    fn main() {
    use std::cell::Cell;

    trait Trait<'a> { }

    impl<'a, 'b> Trait<'b> for Cell<&'a u32> { }

    fn foo<'x, 'y>(x: Cell<&'x u32>) -> impl Trait<'y>
    where 'x: 'y
    {
        x
    }
    }

Here, the function `foo` returns a value of type `Cell<&'x u32>`, which references the lifetime `'x`. However, the return type is declared as `impl Trait<'y>` -- this indicates that `foo` returns "some type that implements `Trait<'y>`", but it also indicates that the return type only captures data referencing the lifetime `'y`. In this case, though, we are referencing data with lifetime `'x`, so this function is in error.

To fix this, you must reference the lifetime `'x` from the return type. For example, changing the return type to `impl Trait<'y> + 'x` would work:

    #![allow(unused)]
    fn main() {
    use std::cell::Cell;

    trait Trait<'a> { }

    impl<'a,'b> Trait<'b> for Cell<&'a u32> { }

    fn foo<'x, 'y>(x: Cell<&'x u32>) -> impl Trait<'y> + 'x
    where 'x: 'y
    {
        x
    }
    }