最近在看RefCell相关的标准库源代码的实现,对Ref和RefMut的实现有一点疑问,向大家请教一下,为什么在RefMut的实现中要加入幽灵数据的成员?
pub struct Ref<'b, T: ?Sized + 'b> {
value: NonNull<T>,
borrow: BorrowRef<'b>,
}
pub struct RefMut<'b, T: ?Sized + 'b> {
value: NonNull<T>,
borrow: BorrowRefMut<'b>,
// `NonNull` is covariant over `T`, so we need to reintroduce invariance.
marker: PhantomData<&'b mut T>,
}
看注释的内容是引入不变性,但是不太理解
看了一下PhantomData的介绍,说是主要用于生命周期和类型相关参数没有使用的情况,但是感觉上面情景不是特别符合。
感谢各位大神的解答!
1
共 2 条评论, 1 页
评论区
写评论简单点说就是为了把可变引用的生命周期跟范型关联
只能建议你先理解 invariance/covariance :)
Variance in Rust: An intuitive explanation