2017-01-22 2 views
19

diesen Code Gegeben:Warum ist das gebundene `T: 'a' erforderlich, um eine Referenz '&' ein T 'zu speichern?

struct RefWrapper<'a, T> { 
    r: &'a T, 
} 

... der Compiler beschwert sich:

error: the parameter type T may not live long enough

consider adding an explicit lifetime bound T: 'a so that the reference type &'a T does not outlive the data it points at.

ich diesen Fehler bereits mehrmals gesehen habe und so weit ich hörte nur an den Compiler und alles hat prima geklappt . Jedoch, mehr darüber nachzudenken, verstehe ich nicht warum Ich muss T: 'a schreiben.

Soweit ich verstehe, ist es bereits unmöglich, eine solche Referenz zu bekommen. &'a T bedeutet, dass es ein Objekt vom Typ T gibt, das für mindestens 'a lebt. Aber wir können keine Referenzen in dem Objekt speichern, die auf Daten mit einer kürzeren Lebensdauer als 'a zeigen. Dies würde bereits zu einem Compilerfehler führen.

In diesem Sinne ist es bereits unmöglich, eine &'a T zu bekommen, wo T nicht überlebt 'a. Daher sollte die zusätzliche Anmerkung (T: 'a) nicht notwendig sein.

Bin ich richtig? Bin ich falsch und wenn ja: wie könnte ich Code brechen, wenn T: 'a nicht benötigt würde?


Links:

+1

I gefragt auf #rust und es scheint, dass [dieser code] (https: // github.com/rust-lang/rost/issues/24622 # issementcomment-94761287) würde Dinge brechen, wenn die 'T: 'a-Anforderung aufgehoben wurde. Aber ich verstehe diesen Code noch nicht wirklich und ich werde jetzt aufhören, es zu versuchen. Hoffentlich versteht jemand, der das Problem versteht, in der Zwischenzeit^_^ –

+0

[Related RFC vom August 2017] (https://github.com/rust-lang/rfcs/pull/2093) –

Antwort

15

Dieser Teil der wohlgeformten Regeln ist. Der Typ &'a T ist nur dann wohlgeformt, wenn T: 'a ("T überlebt" a; es ist erforderlich, weil wir eine Referenz haben, auf die wir während des Scope 'a zugreifen können; der angegebene Wert in T muss mindestens gültig sein Umfang auch).

struct RefWrapper<'a, T> ist ein generischer Typ und es sagt, können Sie Eingang ein Leben lang 'x und eine Art U und wieder einen RefWrapper<'x, U> Typ erhalten. Dieser Typ ist jedoch nicht notwendigerweise wohlgeformt oder sogar implementiert, wenn nicht die Anforderung T: 'a eingehalten wird.

Diese Anforderung stammt von einem Implementierungsdetail; Es ist nicht unbedingt so, dass T und 'a zusammen wie &'a T in den Interna der Struktur verwendet werden. Die Wohlgeformtheitsanforderung muss an die öffentliche Schnittstelle der Struktur RefWrapper heraufgestuft werden, so dass die Anforderungen zur Bildung eines RefWrapper<'_, _>-Typs öffentlich sind, selbst wenn die interne Implementierung dies nicht ist.

(Es gibt andere Orte, an denen die gleiche Anforderung T: 'a zurück kommt, ist aber implict:

pub fn foo<'a, T>(x: &'a T) { } 

wir einen Unterschied erkennen. Hier der Typ &'a T Teil des öffentlichen api ist auch)

+0

Das macht Sinn, danke <3 –

Verwandte Themen