最近在看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
共 4 条评论, 1 页
评论区
写评论简单点说就是为了把可变引用的生命周期跟范型关联
rustc --emit=llvm-ir -O main.rs
底层实现参考LLVM IR的lifetime https://llvm.org/docs/LangRef.html#object-lifetime
先回复问题本身: PhantomData的存在是为了满足lifetime checker. 这个是在编译期实现的.
前置知识点为:
rust的每个类型,具备其生命期。通过类型的生命期,进行生命期检查. 所以 unbounded lifetimes and types are forbidden in struct definitions.
Subtyping and Variance (生命期)的子类型和协变 https://www.notion.so/Subtyping-and-Variance-3f0f015665744695ba7f22acde1bd2b0
具体说明文章 3.10 小节 https://doc.rust-lang.org/nomicon/ https://learnku.com/docs/nomicon/2018
只能建议你先理解 invariance/covariance :)
Variance in Rust: An intuitive explanation