Biorąc pod uwagę ten kod:Dlaczego jest związany "T:" a "wymagany do przechowywania odniesienia` & 'a T`?
struct RefWrapper<'a, T> {
r: &'a T,
}
... kompilator narzeka:
error: the parameter type
T
may not live long enoughconsider adding an explicit lifetime bound
T: 'a
so that the reference type&'a T
does not outlive the data it points at.
Widziałem ten błąd wielokrotnie już i tak daleko Właśnie słuchałem kompilator i wszystko działało w porządku . Jednak myśląc o tym więcej, nie rozumiem, dlaczego muszę napisać .
O ile rozumiem, jest to już niemożliwe do uzyskania takiego odniesienia. Posiadanie &'a T
implikuje, że istnieje obiekt typu T
, który żyje przez co najmniej 'a
. Ale nie możemy przechowywać żadnych odniesień w tym obiekcie, które wskazują na dane o krótszym czasie życia niż 'a
. To byłby już spowodować błąd kompilatora.
W tym sensie jest już niemożliwe uzyskanie &'a T
gdzie T
nie przeżyje 'a
. Dlatego dodatkowa adnotacja (T: 'a
) nie powinna być konieczna.
Mam rację? Czy jestem w błędzie, a jeśli tak, to w jaki sposób mogę złamać kod, jeśli T: 'a
nie byłaby wymagana?
Linki:
I Zapytany o #rust i wygląda na to, że [ten kod] (https: // github.com/rust-lang/rust/issues/24622 # issuecomment-94761287) złamałoby rzeczy, gdyby wymaganie "T:" a "zostało zniesione. Ale tak naprawdę nie rozumiem tego kodu, a na razie przestanę próbować. Mam nadzieję, że ktoś, kto rozumie problem, odpowie w międzyczasie^_^ –
[Podobne dokumenty RFC z sierpnia 2017 r.] (Https://github.com/rust-lang/rfcs/pull/2093) –