rust-quiz:013-mutable-zst.rs

godme發表於2022-07-11
struct S;

fn main() {
    let [x, y] = &mut [S, S];
    let eq = x as *mut S == y as *mut S;
    print!("{}", eq as u8);
}
  • 標記型別

    struct S

    標記型別沒有結構體,並且值唯一,全域性唯一。
    尤其,它是zst

  • zst
    zst不僅是零大小,特殊的一點是:[zst, N]型別也是zst
    其中N都是虛妄,實際取出的結果,都是zst

    struct S;
    fn main() {
      let a = [S, S];
      println!("{}", std::mem::size_of_val(&a)); // 0
    }
  • mut
    對於任意型別,mut始終只能有一個,就是擁有所有權的那一個。
    因此,如果存在多個mut,那麼它們一定不是同一個數值,如果不算zst的話。
    zst型別的資料,因為不存在所謂的修改,僅作為標識。
    因此,它們的mut只是一種空操作。

因為Szst,對於[S, S]取出來的其實都是同一個。
雖然mut修飾了,但是對於zst而言,也是空操作。
因此,兩者是相等的。

1

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章