Ссылка Rust на временное значение не сообщает об ошибке - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий код:

#[derive(Debug)]
pub enum List<'a> {
    Nil,
    Cons(i32, &'a List<'a>)
}

{
    let x = Cons(1, &Cons(2, &Nil));
    println!("{:?}", x);
}

Работает нормально.Я не понимаю, почему этот код не сообщает об ошибке, не упал Cons(2, &Nil) перед построением Cons(1, _)?

Более того, после того, как я добавил пустой impl Drop для List, приведенный выше код больше не работает:

impl<'a> Drop for List<'a> {
    fn drop(&mut self) {

    }
}

Он сообщает об ошибках, которые borrowed value does not live long enough для Cons(2, _) и Nil.

Почему существует такая разница между до и после добавления impl Drop?

1 Ответ

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

Не сбрасывается ли Cons(2, &Nil) перед построением Cons(1, _)?

Если вы привязываете ссылку к временному объекту, Rust продлевает время жизни временного объекта, необходимое для привязки;см. этот ответ для подробностей.

Почему существует такая разница между до и после добавления impl Drop?

См. этот комментарий.В вашем примере расширенное время жизни временного соответствия соответствует времени жизни x.Когда struct содержащий ссылки не имеет реализации Drop,

допустимо, чтобы ссылка и референт имели одинаковое время жизни: ссылка не может использоваться небезопасно.Чтобы ввести Drop значение для ситуации, референт должен строго пережить ссылку, чтобы обеспечить четкий порядок запуска drop методов.

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