| A trait implementation returns a reference without an | |
| explicit lifetime linking it to `self`. | |
| It commonly arises in generic trait implementations | |
| requiring explicit lifetime bounds. | |
| Erroneous code example: | |
| ```compile_fail,E0803 | |
| trait DataAccess<T> { | |
| fn get_ref(&self) -> T; | |
| } | |
| struct Container<'a> { | |
| value: &'a f64, | |
| } | |
| // Attempting to implement reference return | |
| impl<'a> DataAccess<&f64> for Container<'a> { | |
| fn get_ref(&self) -> &f64 { // Error: Lifetime mismatch | |
| self.value | |
| } | |
| } | |
| ``` | |
| The trait method returns &f64 requiring an independent lifetime | |
| The struct Container<'a> carries lifetime parameter 'a | |
| The compiler cannot verify if the returned reference satisfies 'a constraints | |
| Solution | |
| Explicitly bind lifetimes to clarify constraints: | |
| ``` | |
| // Modified trait with explicit lifetime binding | |
| trait DataAccess<'a, T> { | |
| fn get_ref(&'a self) -> T; | |
| } | |
| struct Container<'a> { | |
| value: &'a f64, | |
| } | |
| // Correct implementation (bound lifetimes) | |
| impl<'a> DataAccess<'a, &'a f64> for Container<'a> { | |
| fn get_ref(&'a self) -> &'a f64 { | |
| self.value | |
| } | |
| } | |
| ``` |