Учитывая этот код:
trait Trait {}
struct Child;
impl Trait for Child {}
struct Father<'a> {
child: &'a Box<dyn Trait>,
}
impl<'a> Trait for Father<'a> {}
fn main() {
let child: Box<dyn Trait> = Box::new(Child {});
let father: Box<dyn Trait> = Box::new(Father { child: &child });
let grandf: Box<dyn Trait> = Box::new(Father { child: &father });
}
Этот код не компилируется с Rust 1.30.0, и я получаю следующую ошибку:
error[E0597]: `child` does not live long enough
--> src/main.rs:11:60
|
11 | let father: Box<dyn Trait> = Box::new(Father { child: &child });
| ^^^^^ borrowed value does not live long enough
12 | let grandf: Box<dyn Trait> = Box::new(Father { child: &father });
13 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
Я могу скомпилировать код, используя child: &'a Box<dyn Trait + 'a>
, но я не понимаю, почему это происходит.
Согласно RFC 0599 , правила привязки объекта по умолчанию должны читать тип &'a Box<Trait>
как &'a Box<Trait + 'a>
. Вместо этого он действует, как это было &'a Box<Trait + 'static>
.
- Почему мой оригинальный код не компилируется?
- Принимает ли объект объекта по умолчанию значение
&'a Box<Trait + 'static>
, как кажется?
Существует ключевое различие между этим вопросом и Почему необходимо добавить время жизни к черте с помощью оператора плюс (Iterator + 'a)? .
Согласно RFC 0599 , который был упомянут в ответе на этот вопрос, существует разница между типом &'a Box<SomeTrait>
и просто Box<SomeTrait>
, что позволяет им иметь разные времена жизни по умолчанию. Таким образом, в этом случае, согласно RFC, я думаю, что время жизни в штучной упаковке черты по умолчанию должно быть 'a
, а не 'static
.
Это означает, что либо существует более новый RFC, изменяющий эту спецификацию RFC 0599, либо существует другая причина, по которой этот код не работает.
В обоих случаях этот ответ из другого вопроса не относится к этому, и, следовательно, это не дублированный вопрос.