为什么我必须使用 PhantomData?在这种情况下它在做什么?

Ach*_*him 2 generics rust

仅当我包含标有“???”的行时,以下代码才会编译。如果我删除该行,我会收到很多关于参数“S”从未被使用的错误消息。我在更大的场景中偶然发现了这个“问题”,并且很难确定它。据我所知,这是由于类型之间的循环引用而发生的。

struct Question<S> {
    x: Vec<AnswerRef<S>>,
    _y: PhantomData<S>  // ???
}

struct QuestionRef<S>(Rc<Question<S>>);

struct Answer<S> {
    x: Option<QuestionRef<S>>
}

struct AnswerRef<S>(Rc<Answer<S>>);
Run Code Online (Sandbox Code Playgroud)

添加PhantomData解决了问题,但我不明白为什么。我不明白为什么它会在这种情况下产生影响。有人可以向我解释一下吗?

caf*_*e25 6

Rust 编译器在这里非常聪明,它会检测 的循环使用S并确定您可以完全删除它以获得相同的数据结构。您可以使用PhantomData“使用”未使用的类型参数,因为它们在这里。