#![allow(dead_code)]
#![allow(unused_variables)]
use std::cell::Cell;
pub struct Foo<'a> {
pub x1: &'a i32,
pub x2: &'a i32,
pub data: Cell<&'a i32>,
}
fn test<'a>(foo: &Foo<'a>) {
let x1 = 1;
let data = Cell::new(foo.data.get());
// UNCOMMENT THE NEXT LINE
// let data = foo.data.clone();
Foo {
x1: &x1,
x2: foo.x2,
data,
};
}
Le code ci-dessus se compile, mais si vous décommentez la ligne que j'ai marquée dans le code (et éventuellement commentez la ligne qui la précède), vous verrez l'erreur suivante (j'utilise Rust 1.58.1) :
error[E0597]: `x1` does not live long enough
--> src/lib.rs:18:13
|
12 | fn test<'a>(foo: &Foo<'a>) {
| -- lifetime `'a` defined here
...
18 | x1: &x1,
| ^^^
| |
| borrowed value does not live long enough
| this usage requires that `x1` is borrowed for `'a`
...
22 | }
| - `x1` dropped here while still borrowed
For more information about this error, try `rustc --explain E0597`.
La ligne qui provoque l'erreur lorsqu'elle est décommentée fortement semble avoir le même effet que la ligne qui la précède - j'ai essentiellement intégré l'implémentation du clone ; citation de la source stdlib de la rouille :
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Copy> Clone for Cell<T> {
#[inline]
fn clone(&self) -> Cell<T> {
Cell::new(self.get())
}
}
Question : d'où vient la différence ?