PhantomData 是 Rust 中一个强大的概念,允许我们在不实际使用类型的情况下,保留其属性。主要特点有:1. Auto Trait:PhantomData 实现的 auto trait(又名 OIBITs)仅针对不实现特定 trait 的类型。它允许我们使用 "deny-lists" 来指定类型不实现某个 trait,而与通常的 "allow-listing" 相反。2. 'static Lifecycle vs Generics:结构体是否为 'static 依赖于它是否包含非 'static 元素。一旦包含,整个结构会变为泛型并关联到该生命周期参数。3. 应用示例:PhantomData 可用于实现 "unsafe" trait,表示数据在引用期间是不可变的。它还能用于创建 PhantomNotSend 和 PhantomNotSync,帮助实现更严格的数据访问控制。4. 人工泛型结构:当人们希望结构具有额外的类型或生命周期参数时,可以使用 PhantomData。例如,OutRef 结构体就是通过结合 PhantomData 和原始指针来实现的,以提供外部引用类型。5. 非零优化:通过使用 core 库中的 NonNull 结构,可以提供非 null 的原始指针,并确保指针在给定不变量时不会是 null。6. 型变(非正式):子类型化是允许类型作为另一类型子类型的属性。例如,数组、引用和 Box 可以被视为特定类型的一部分。型变属性允许结构体在不同生命周期参数下具有协变或不变性。7. 解决可靠性问题:通过使用 PhantomData,可以确保结构体在不同生命周期参数下的类型一致性,防止不合理的类型转换和数据访问。在使用 PhantomData 时,保持不变性至关重要,以确保库/API 用户的调用点工程学不会受到影响。此外,PhantomData 也可用于表示对类型的所有权,以帮助 Rust 的 drop checker 防止不合理配置。PhantomData 是一个灵活且强大的工具,允许开发者在不引入额外内存开销的情况下,利用类型属性进行高级抽象。