为什么 Rust 结构上未使用的类型参数被视为错误而不是警告?

lxh*_*hom 10 compiler-construction generics rust

在有人将其标记为重复之前,我知道如何修复它(并且已经得到了回答),但我想了解为什么存在此限制,并且我在这里或 Rust 文档中没有找到答案。

例如,我写了这样的东西:

struct ItemList<T> {
  items: Vec<T>
}
impl<T> ItemList<T> {
  fn getFirstItem(&self) -> Link<T> { Link { position: 0 } }
}

struct Link<T> {
  position: usize
}
impl<T> Link<T> {
  fn getFromList<'a>(&self, list: &'a ItemList<T>) -> &'a T {
    &list.items[self.position]
  }
}
Run Code Online (Sandbox Code Playgroud)

但 rustc 拒绝我的代码并出现以下错误:

error[E0392]: parameter `T` is never used
 --> src/main.rs:8:13
  |
8 | struct Link<T> {
  |             ^ unused parameter
  |
  = help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
  = help: if you intended `T` to be a const parameter, use `const T: usize` instead

For more information about this error, try `rustc --explain E0392`.
Run Code Online (Sandbox Code Playgroud)

为什么这是一个错误而不是警告?类型参数只会降低编译时的性能(如果我理解正确的话),那么为什么要强制删除它或使用 PhantomData 标记呢?它是否有一些我错过的含义?

mca*_*ton 9

这是一个差异问题。

Rust 通过其用途来确定类型参数的方差。如果不使用类型,Rust 就无法知道类型的方差。

Rustonomicon有一个关于方差的章节