&
会导致它失败: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; n]
那样 强制转换成 [T]
。您提供的文档描述了与无大小强制转换相关的两个特征:Unsize
和 CoerceUnsized
。 [T; n]
实现了 Unsize<[T]>
,因此&[T; n]
实现了 CoerceUnsized<&[T]>
; 这本质上是相同的事情,您的代码有效地展示了两者。不使用引用(或某些类型的指针),不可能编写将[T; n]
强制转换为[T]
的函数,因为无大小强制转换只在某种类型的指针后发生。
&[T; n]
到&[T]
的转换? - Some NameCoerceUnsized <&U> for &T
已经为T: Unsize<U>
实现,这意味着您示例中的强制转换是存在的。 - Sven MarnachT
实现了Deref<Target = U>
,则将&T
或&mut T
转换为&U
。 - Peter Hall