#[stable(feature = "rust1", since = "1.0.0")]
impl<T: ?Sized, A: Allocator> Deref for Box<T, A> {
type Target = T;
fn deref(&self) -> &T {
&**self
}
}
我的理解是*self
得到Box<T>
,**self
得到T,最后返回T的引用。那**self
是怎么取出T呢?
1
共 4 条评论, 1 页
评论区
写评论可以打印mir出来:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=7c3c6a45c599ffe00fc6cf4ac324799d deref对应这一段MIR。
deref中
&**self
分为:&Box<usize>
*const usize
哈哈,有个万能答案,所有不能用常理解释的现象都可以认为是编译器做了内置处理。
就这个例子这样推测是合理的。 deref() 本质就是来实现操作符 * 重载的,实现了这个trait,就可以方便的使用 *obj 来解引用,它本质上是等同于 obj.deref() 回到本题, *self得到Box,**self(如果没有编译器内部魔法)想想会发生什么事?会形成对deref()的递归调用。所以我们就似懂非懂的推测是编译做了内部处理。
好的,我知道了
--
👇
night-cruise: 应该是编译器内部对 Box 做特殊处理了
应该是编译器内部对 Box 做特殊处理了