Rust errors / Ownership and borrowing
Rust compiler error · checked with rustc 1.99.0
Rust error E0491: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references
What it meansA reference has a longer lifetime than the data it references.
What rustc prints
error[E0491]: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references --> main.rs:10:5 | 10 | type Out = &'a Foo<'b>; // error! | ^^^^^^^^ | note: the pointer is valid for the lifetime `'a` as defined here --> main.rs:9:6 | 9 | impl<'a, 'b> Trait<'a, 'b> for usize { | ^^ note: but the referenced data is only valid for the lifetime `'b` as defined here --> main.rs:9:10 | 9 | impl<'a, 'b> Trait<'a, 'b> for usize { | ^^
Real output of rustc 1.99.0 compiling the official example below (2021 edition). Your names and line numbers will differ; the first line is the part to match.
The compiler team's explanation
A reference has a longer lifetime than the data it references.
Erroneous code example:
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!
}From rustc --explain E0491 (1.99.0), part of the Rust project, MIT or Apache-2.0. Official page.
Related errors
- E0382borrow of moved value
- E0499cannot borrow as mutable more than once at a time
- E0502cannot borrow as mutable because it is also borrowed as immutable
- E0106missing lifetime specifier
- E0476lifetime of the source pointer does not outlive lifetime bound of the object type
- E0478A lifetime bound was not satisfied
- E0492interior mutable shared borrows of temporaries that have their lifetime extended until the end of the program are not allowed
- E0493destructor of `(DropType, DropType)` cannot be evaluated at compile-time
Up next
Often hit nextE0382: borrow of moved valueA related error from the same family.Read it next →Did this answer your question?