这个函数的实现是什么:
fn unbox<T>(value: Box<T>) -> T {
// ???
}
文档中唯一看起来像我想要的函数是 Box::into_raw
. 以下将进行类型检查:
fn unbox<T>(value: Box<T>) -> T {
*value.into_raw()
}
这给出了错误 error[E0133]: dereference of raw pointer requires unsafe function or block
. 将它包装在 unsafe { ... }
块中可以修复它 .
fn unbox<T>(value: Box<T>) -> T {
unsafe { *value.into_raw() }
}
这是正确的实施吗?如果是这样,为什么它不安全?这是什么意思?
也许这个问题显示了我对 Box
实际如何运作的一般不确定性 .
1 回答
取消引用值:
回到1.0之前的Rust,堆分配值是非常特殊的类型,他们使用了sigil
~
(如~T
) . 沿着通往Rust 1.0的道路,这个特殊套管的大部分被移除了......但不是全部 .这个特殊的专业名称为"deref move",并且有一个proto-RFC关于支持它作为一流的概念 . 在那之前,答案是“因为
Box
很特别” .