我似乎无法弄清楚为什么:

let a = Box::new(5i32);
let _:() = *a;

告诉我第二行的分配类型是i32而不是&i32,因为Deref.deref()(我假设它在*a处被调用)返回&T

另外,如果我自己调用deref():
let _:() = <Box<i32> as Deref>::deref(&a);

我得到了预期的&i32

最佳答案

*foo与调用foo.deref()不同。如果是这样,您将永远无法真正取消引用值。 ^ _ ^*是“调用Deref::deref然后进入提供的地址”的语法糖。这正是人们对运营商的期望。存在Deref以使其可扩展。
最后一点掩盖了bluss' answer covers much better的一些细节。
也可以看看:

  • How do I get an owned value out of a `Box`?
  • 10-04 14:01