Dereferencing doesn't necessarily produce an (intermediate) value. Consider
let b = Box::new(1);
(*b).clone();
The method i32::clone()
is called with a &self
argument where the reference points to the value inside the box, not to a temporary value that could be produced by (*b)
.
The trait Deref
is part of implementing dereferencing (just like DerefMut
).
There is no corresponding trait to what *
can additionally do on a box: Move the inner value out and discard the box; this is colloquially called DerefMove
but remains a compiler-hardcoded box speciality at this point.
When the compiler sees (*a)
, it has to infer whether to use Deref
, DerefMut
or “DerefMove
”; it is inferred from how the expression is used: if you call a &self
method on the result, Deref
is used, for example.
Edited: Inherently copyable types (trait Copy
), use Deref
followed by copy instead of “DerefMove
”; this is then no longer resticted to Box, but works with all smart pointers.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…