rust lifetime

rust - ¿Por qué se requiere el límite `T: ''a` para almacenar una referencia` &'' a T`?



lifetime (2)

Esto es parte de las reglas de buena formación. El tipo &''a T solo está bien formado si T: ''a ("T sobrevive ''a''; es obligatorio porque tenemos una referencia a la que podemos acceder durante el alcance ''a ; el valor apuntado a T necesita ser válido para al menos ese alcance, también).

struct RefWrapper<''a, T> es un tipo genérico y dice que puede ingresar una vida ''x un tipo U y obtener un RefWrapper<''x, U> nuevamente. Sin embargo, este tipo no está necesariamente bien formado o incluso implementado a menos que se respete el requisito T: ''a .

Este requisito proviene de un detalle de implementación; no es necesariamente para que T y ''a se utilicen juntos como &''a T en el interior de la estructura. El requisito de buena formación debe promoverse a la interfaz pública de la estructura RefWrapper , de modo que los requisitos para formar un tipo RefWrapper<''_, _> sean públicos, incluso si la implementación interna no lo es.

(Hay otros lugares donde el mismo requisito T: ''a vuelve pero está implícito:

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

Vemos una diferencia: aquí el tipo &''a T es parte de la API pública, también.)

Dado este código:

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

... el compilador se queja:

error: el tipo de parámetro T puede no vivir lo suficiente

considere agregar un límite de vida útil explícito T: ''a para que el tipo de referencia &''a T no sobreviva a los datos a los que apunta.

Ya he visto este error varias veces y hasta ahora solo escuché el compilador y todo salió bien. Sin embargo, pensando más en ello, no entiendo por qué tengo que escribir T: ''a .

Por lo que entiendo, ya es imposible obtener tal referencia. Tener &''a T implica que hay un objeto de tipo T que vive al menos ''a . Pero no podemos almacenar ninguna referencia en dicho objeto que apunte a que los datos tengan una vida útil más corta que ''a . Esto ya daría como resultado un error del compilador.

En ese sentido, ya es imposible obtener una &''a T donde T no sobrevive ''a . Por lo tanto, la anotación adicional ( T: ''a ) no debería ser necesaria.

Estoy en lo cierto ¿Estoy equivocado y si es así: cómo podría descifrar el código, si T: ''a no sería necesario?

Campo de golf:


Felicitaciones, tenías razón! A partir de Rust 1.31, gracias a RFC 2093, Infer T: ''x supera los requisitos en las estructuras , se eliminó el requisito para que el usuario escriba esta restricción:

Elimine la necesidad de anotaciones explícitas de T: ''x en estructuras. Inferiremos su presencia en base a los campos de la estructura. En resumen, si la estructura contiene una referencia, directa o indirectamente, a T con vida ''x , entonces inferiremos que T: ''x es un requisito

Básicamente, no hubo un caso en el que esto no fuera necesario, por lo que no tuvo mucho valor forzar al programador a escribirlo.