Смущает время жизни Box<Trait> в структуре

struct Wrap<'a> {
    pub data: Option<&'a i32>,
}

pub trait Boxable {
    fn get_data(&self) -> Option<&i32>;
}

impl<'a> Boxable for Wrap<'a> {
    fn get_data(&self) -> Option<&i32> {
        self.data
    }
}

struct ContTrait {
    pub vbox: Box<Boxable>,
}

struct ContWrap<'a> {
    pub vbox: Box<Wrap<'a>>,
}

fn main() {
    let x1 = 15;

    let bt = Box::new(Wrap { data: Some(&x1) });
    // let mut c = ContTrait { vbox: Box::new(Wrap {data : Some(&x1)}) };
    let mut c2 = ContWrap {
        vbox: Box::new(Wrap { data: Some(&x1) }),
    };
}

Я не могу объяснить, почему только закомментированная строка не может быть скомпилирована и думает x1жизнь не достаточно длинна. Похоже на то c2 эквивалентно этому, кроме Box для Wrap структурировать напрямую. bt просто удаляет один слой структуры. Я не могу понять, что делает ContTrait вести себя так по-другому.

Вот сообщение об ошибке при раскомментировании ContTrait линия:

error[E0597]: `x1` does not live long enough
  --> src/main.rs:27:63
   |
27 |     let mut c = ContTrait { vbox: Box::new(Wrap {data : Some(&x1)}) };
   |                                                               ^^ borrowed value does not live long enough
...
31 | }
   | - borrowed value only lives until here
   |
   = note: borrowed value must be valid for the static lifetime...

детская площадка

0 ответов

Другие вопросы по тегам