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.