모든 유형 'T'에 대해 'T'가 'U'로 강제 변환되면 '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

아니요, 레이어를 하나 더 추가 &하면 실패하기 때문입니다.

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]. 링크 한 문서는 크기가 지정되지 않은 강제와 관련된 두 가지 특성 인 UnsizeCoerceUnsized. [T; n]구현 Unsize<[T]>하고 따라서 &[T; n] 구현합니다 CoerceUnsized<&[T]>. 이것은 본질적으로 동일한 것이며 코드는 두 가지를 효과적으로 보여줍니다. 강제 변환하는 기능을 쓸 수 없을 것 [T; n]까지 [T] 없이 참조를 사용 (또는 어떤 종류의 포인터) unsizing 강제 변환은 포인터의 일종 뒤에 일어날 때문입니다.