すべてのタイプの `T`、` U`について `T`が` U`に強制変換された場合、 `&T`は`&U`に強制変換されるというのは本当ですか?

Aug 17 2020

それはだ十分に文書こと[T; n]に缶強制を[T]。次のコードも整形式です。

fn test(){
    let _a: &[i32] = &[1, 2, 3];
}

ここに、&[T; n]強制されたものがあり&[T]ます。

それはすべての種類のことは事実であるTU場合Tに強制変換されUた後&Tに強制変換されますか&U

リファレンスには(少なくとも明示的に)文書化されていません。

回答

5 trentcl Aug 17 2020 at 19:54

いいえ、レイヤーをもう1つ追加&すると失敗するため、次のようになります。

fn oops() {
    let a: &[i32; 3] = &[1, 2, 3];
    let _b: &&[i32] = &a;
}
error[E0308]: mismatched types
 --> src/lib.rs:8:23
  |
8 |     let _b: &&[i32] = &a;
  |             -------   ^^ expected slice `[i32]`, found array `[i32; 3]`
  |             |
  |             expected due to this
  |
  = note: expected reference `&&[i32]`
             found reference `&&[i32; 3]`

さらに、に[T; n] 強制する [T]のと同じ意味でに&[T; n] 強制するの は事実ではありません&[T]。リンクされたドキュメントは、無サイズ強制型変換に関連する2つの特徴を説明しますUnsizeCoerceUnsized[T; n]実装Unsize<[T]>、およびので、 &[T; n]道具CoerceUnsized<&[T]>。これは本質的に同じことであり、コードは両方を効果的に示しています。強制的に変換することを関数を記述することはできないだろう[T; n][T] せずにunsizing強制型変換は、ポインタだけのいくつかの種類の後ろに場所を取るので、参照(またはある種のポインタ)を使用します。