What happens when I call std::mem::drop with a reference instead of an owned value?
Asked Answered
P

1

6
fn main() {
    let k = "fire";

    drop(k);

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

Playground

Why am I still able to use k after dropping it? Does drop not deref a reference automatically? If yes, then why? What does the implementation of Drop look like for &str?

Presuppose answered 23/3, 2019 at 13:52 Comment(0)
B
9

What happens when I call std::mem::drop with a reference

The reference itself is dropped.

a reference instead of an owned value

A reference is a value.

Why am I still able to use k after dropping it?

Because immutable pointers implement Copy. You pass in a copy of the reference and it's dropped.

Does drop not deref a reference automatically?

No, it does not.

what does the implementation of Drop look like for &str?

There isn't one for any kind of reference, immutable or mutable, so it's effectively 1:

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

See also:


1 — As Peter Hall points out, there is a difference between having an empty Drop implementation and having no user-provided Drop implementation, but for the purposes of this question they are the same.

Brewis answered 23/3, 2019 at 13:59 Comment(1)
"so it's effectively:..." — The mere fact of having a Drop impl has other implications, so this isn't quite true..Threepence

© 2022 - 2024 — McMap. All rights reserved.