`drop(&mut self)` means, strictly going by the types I could call drop twice! We want an `&own` that is like C++'s rvalue references (so we can still drop DSTs) so we can have `drop(&own self)`.
This correctly prevents one from calling Drop::drop twice without extra hacks, and demonstrates that the location is completely deinitialized and can be reinitialized to anything.
It is also dual to how, seemingly magically,
let x;
x = foo();
works without Rust thinking there is an old value of `x` to get rid of.
> `drop(&mut self)` means, strictly going by the types I could call drop twice!
Wouldn't calling a destructor on an object twice will also compile in C++? I don't really see this as an issue in either language; the solution is "don't ever call `drop`/destructors manually"
This correctly prevents one from calling Drop::drop twice without extra hacks, and demonstrates that the location is completely deinitialized and can be reinitialized to anything.
It is also dual to how, seemingly magically,
works without Rust thinking there is an old value of `x` to get rid of.