Смущен временем жизни 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...

игровая площадка


person Haoliang Jiang    schedule 13.12.2018    source источник
comment
Box<Trait> эквивалентно Box<Trait + 'static>. Если вы хотите другое время жизни, вам нужно быть явным и использовать Box<Trait + 'a>.   -  person Sven Marnach    schedule 13.12.2018
comment
(Не уверен, можно ли считать это дубликатом, но ответ охватывает важные моменты, на которые следует обратить внимание.)   -  person Sven Marnach    schedule 13.12.2018
comment
Судя по вашим сообщениям об ошибках, вы все еще используете Rust 2015. Вам рекомендуется переключиться на Rust 2018, который здесь дает лучшее сообщение об ошибке.   -  person Shepmaster    schedule 14.12.2018