모든 유형 'T'에 대해 'T'가 'U'로 강제 변환되면 'U'가 '& T'가 '& U'로 강제 변환된다는 것이 사실입니까?
그건 잘 문서화 그 [T; n]
에게 캔 강제 변환을 [T]
. 다음 코드도 잘 구성되어 있습니다 .
fn test(){
let _a: &[i32] = &[1, 2, 3];
}
여기 &[T; n]
에 &[T]
.
그것은 모든 종류의 사실인가 T
, U
경우 T
에 강제되어 U
다음 &T
에 강요한다 &U
?
참조에 문서화되어 있지 않습니다 (적어도 명시 적으로).
답변
5 trentcl
아니요, 레이어를 하나 더 추가 &
하면 실패하기 때문입니다.
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]
. 링크 한 문서는 크기가 지정되지 않은 강제와 관련된 두 가지 특성 인 Unsize
및 CoerceUnsized
. [T; n]
구현 Unsize<[T]>
하고 따라서 &[T; n]
구현합니다 CoerceUnsized<&[T]>
. 이것은 본질적으로 동일한 것이며 코드는 두 가지를 효과적으로 보여줍니다. 강제 변환하는 기능을 쓸 수 없을 것 [T; n]
까지 [T]
없이 참조를 사용 (또는 어떤 종류의 포인터) unsizing 강제 변환은 포인터의 일종 뒤에 일어날 때문입니다.