すべてのタイプの `T`、` U`について `T`が` U`に強制変換された場合、 `&T`は`&U`に強制変換されるというのは本当ですか?
Aug 17 2020
それはだ十分に文書こと[T; n]
に缶強制を[T]
。次のコードも整形式です。
fn test(){
let _a: &[i32] = &[1, 2, 3];
}
ここに、&[T; n]
強制されたものがあり&[T]
ます。
それはすべての種類のことは事実であるT
、U
場合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つの特徴を説明しますUnsize
とCoerceUnsized
。[T; n]
実装Unsize<[T]>
、およびので、 &[T; n]
道具CoerceUnsized<&[T]>
。これは本質的に同じことであり、コードは両方を効果的に示しています。強制的に変換することを関数を記述することはできないだろう[T; n]
と[T]
せずにunsizing強制型変換は、ポインタだけのいくつかの種類の後ろに場所を取るので、参照(またはある種のポインタ)を使用します。