Почему & 'Box <Trait>рассматривается как &' Box <Trait + 'static>, а не &' Box <Trait + 'a>? - PullRequest
0 голосов
/ 29 октября 2018

Учитывая этот код:

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>.

  1. Почему мой оригинальный код не компилируется?
  2. Принимает ли объект объекта по умолчанию значение &'a Box<Trait + 'static>, как кажется?

Существует ключевое различие между этим вопросом и Почему необходимо добавить время жизни к черте с помощью оператора плюс (Iterator + 'a)? .

Согласно RFC 0599 , который был упомянут в ответе на этот вопрос, существует разница между типом &'a Box<SomeTrait> и просто Box<SomeTrait>, что позволяет им иметь разные времена жизни по умолчанию. Таким образом, в этом случае, согласно RFC, я думаю, что время жизни в штучной упаковке черты по умолчанию должно быть 'a, а не 'static.

Это означает, что либо существует более новый RFC, изменяющий эту спецификацию RFC 0599, либо существует другая причина, по которой этот код не работает.

В обоих случаях этот ответ из другого вопроса не относится к этому, и, следовательно, это не дублированный вопрос.

1 Ответ

0 голосов
/ 30 октября 2018

Эти правила были скорректированы на RFC 1156 (выделено мной):

Настройка алгоритма привязки объекта по умолчанию для таких случаев, как &'x Box<Trait> и &'x Arc<Trait>. Существующий алгоритм по умолчанию будет &'x Box<Trait+'x>. Предлагаемое изменение: , по умолчанию &'x Box<Trait+'static>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...