Что происходит, когда я вызываю std :: mem :: drop со ссылкой вместо собственного значения? - PullRequest
4 голосов
/ 23 марта 2019
fn main(){
    let k = "fire";

    drop(k);

    println!("{:?}", k);
}

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

Почему я все еще могу использовать k после его сброса? drop не разыскивает ссылку автоматически? Если да, то почему? Как выглядит реализация Drop для &str?

1 Ответ

4 голосов
/ 23 марта 2019

Что происходит, когда я звоню std::mem::drop со ссылкой

Сама ссылка отброшена.

ссылка вместо собственной стоимости

Ссылка - это значение.

Почему я все еще могу использовать k после его сброса?

Поскольку неизменяемые указатели реализуют Copy. Вы передаете копию ссылки, и она отбрасывается.

Не drop не разыскивает ссылку автоматически?

Нет, это не так.

как выглядит реализация Drop для &str?

Не существует ни одного справочника, неизменяемого или изменяемого, поэтому эффективно 1 :

impl Drop for &str {
    fn drop(&mut self) {}
}

Смотри также:


1 - Как указывает Питер Холл , существует разница между пустой реализацией Drop и отсутствием реализации Drop, предоставленной пользователем, но для целей из этого вопроса они одинаковы.

...