1

次の機能を使用しようとしていますCoerceUnsized:

use std::rc::Rc;
use std::borrow::Borrow;

fn main() {
    // Create (sized) i32 wrapped in an rc.
    let a0: Rc<i32> = Rc::new(0i32);
    // Coerce to (unsized) Borrow<i32> wrapped in an rc.
    // Works fine in Beta and Nightly cause of CoerceUnsized.
    let a1: Rc<Borrow<i32>> = a0.clone();

    // Create (sized) i32 in nested rcs.
    let b0: Rc<Rc<i32>> = Rc::new(Rc::new(0i32));
    // Coerce to (unsized) Borrow<i32> in nested rcs.
    // Does not compile in Stable, Beta or Nightly.
    let b1: Rc<Rc<Borrow<i32>>> = b0.clone();

    println!("{}, {}", a1.borrow(), b1.borrow());
}

遊び場

ただし、入れ子になった from Rc<Rc<i32>>to型の強制Rc<Rc<Borrow<i32>>>はコンパイルされません。

なぜCoerceUnsized再帰的に動作しないのですか? 明示的なキャストなどの回避策はありますか?

4

1 に答える 1

4

を に変換するRc<i32>Rc<Borrow<i32>>は、 の隣に vtable ポインタを追加するだけでよく、Rcによって管理されるメモリには影響しませんRcRc<Rc<i32>>反対に、への変換Rc<Rc<Borrow<i32>>は vtable ポインタを inner の隣にRc格納することを意味します。これには、外部によって管理されるメモリを変更 (および拡大) する必要がありますRc(つまり、事実上、まったく新しい割り当てが必要になります)。これは手動で行うこともできますが、強制の範囲をはるかに超えています。

于 2016-08-21T15:51:41.397 に答える