有据可查 [T;n] 可以强制转换为 [T] .以下代码也是格式正确的:
It's well documented that [T; n] can coerce to [T]. The following code is also well-formed:
fn test(){ let _a: &[i32] = &[1, 2, 3]; }在这里,我们有& [T;n] 被强制为& [T] .
Here we have that &[T; n] is coerced to &[T].
对于所有类型的 T ,如果 T 强制为 U ,则 U 是否为 U >& T 被强制为& U ?
Is it true that for all types T, U if T is coerced to U then &T is coerced to &U?
参考文献中没有对此进行记录(至少是明确记录).
It's not documented in the reference (at least explicitly).
推荐答案否,因为再增加一层& 会导致失败:
No, because adding one more layer of & causes it to fail:
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] 而没有使用引用(或某种类型的指针),因为取消大小调整的强制仅发生在某种类型的指针后面.
Further, it is not the case that [T; n] coerces to [T] in the same sense that &[T; n] coerces to &[T]. The documentation you linked describes the two traits related to unsized coercions: Unsize and CoerceUnsized. [T; n] implements Unsize<[T]>, and therefore &[T; n] implements CoerceUnsized<&[T]>; this is essentially the same thing, and your code effectively demonstrates both. It would not be possible to write a function that coerces [T; n] to [T] without using references (or pointers of some sort) because unsizing coercions only take place behind some kind of pointer.
更多推荐
对于所有类型"T","U",如果将"T"强制转换为"U",然后将“&am
发布评论