我似乎无法弄清楚为什么:
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的一些细节。
也可以看看: