作者回复: 👍 是的,非常厉害!这个 bug 我也是又看了一遍代码才发现。
作者回复: 👍
作者回复: 我的理解是大部分时候 PhantomData 跟其它语言的 Phantom Type 是一个作用,为数据结构提供声明时没用用到,但在实现时需要用到的类型。因为这里你实实在在就只用 T 来保证类型的正确性,并没有涉及到 owership。 但在有些场合下,比如 Unique<T>,这里,如果没用 PhantomData<T>的话,你想想 Unique<T> 是否 own T?并不 own,因为 pointer 是一个指针类型,所以从类型上,Unique<T> 不 own T,但这里 Unique<T> 应该 own T 才对。所以 Rust 使用 PhantomData 来表述这个作用,见:https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data ```Rust pub struct Unique<T: ?Sized> { pointer: *const T, _marker: PhantomData<T>, } ``` 这属于 PhantomData 的高级用法,大部分时候我们用类型系统解决问题需要使用 PhantomData 时,都是大家在其他语言中惯常的用法,所以我没有提这个 owership 的用法。
作者回复: 👍