强制转换

在某些情况下,类型可以隐式地强制转换为其他类型。这些更改通常只是类型的*弱化*,主要集中在指针和生命周期方面。它们的存在主要是为了让 Rust 在更多情况下“正常工作”,并且基本上是无害的。

有关所有强制转换类型的详尽列表,请参阅参考文档中的强制转换类型部分。

请注意,我们在匹配特征时不会执行强制转换(接收器除外,请参阅下一页)。如果某个类型 U 有一个 impl,并且 T 可以强制转换为 U,但这并不构成对 T 的实现。例如,以下代码将无法通过类型检查,即使将 t 强制转换为 &T 是可以的,并且 &T 有一个 impl

trait Trait {}

fn foo<X: Trait>(t: X) {}

impl<'a> Trait for &'a i32 {}

fn main() {
    let t: &mut i32 = &mut 0;
    foo(t);
}

它会像下面这样报错

error[E0277]: the trait bound `&mut i32: Trait` is not satisfied
 --> src/main.rs:9:9
  |
3 | fn foo<X: Trait>(t: X) {}
  |           ----- required by this bound in `foo`
...
9 |     foo(t);
  |         ^ the trait `Trait` is not implemented for `&mut i32`
  |
  = help: the following implementations were found:
            <&'a i32 as Trait>
  = note: `Trait` is implemented for `&i32`, but not for `&mut i32`