2
struct MyCell<T> {
    value: T
}

impl<T> MyCell<T> {
    fn new(value: T) -> Self {
        MyCell { value }
    }
    
    fn get(&self) -> &T {
        &self.value
    }
    
    fn set(&self, new_value: T) {
        unsafe { 
            *(&self.value as *const T as *mut T) = new_value; 
        }
    }
}

fn set_to_local(cell: &MyCell<&i32>) {
    let local = 100;
    cell.set(&local);
}

fn main() {
    let cell = MyCell::new(&10);
    set_to_local(&cell);
}

を呼び出すと、 isおよびiscell.set(&local)と仮定すると、共分散規則により の型がからに変更されると言われます。cell'x'&local'ycell&MyCell<'x, &i32>&MyCell<'y, &i32>

unsafe ブロック内の割り当ては、 のパラメーターの有効期間の推定にどのように影響しますset()か? 生のポインターには有効期間がありません。コンパイラは、共分散を使用して同じ有効期間を作成し、同じ有効期間を持つ必要があることをどのように認識しcellますnew_valueか?

4

1 に答える 1