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?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
sn99
  • 843
  • 8
  • 24

1 Answers1

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.

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
  • 3
    _"so it's effectively:..."_ — The mere fact of having a `Drop` impl has other implications, so this isn't _quite_ true.. – Peter Hall Mar 31 '19 at 06:44