Confundido por la semántica de movimiento de los campos de estructura dentro de un cuadro

Si hago lo siguiente, aparece un error:

struct A;
struct B;

fn consume_a(_a: A) {}
fn consume_b(_b: B) {}

struct C(A, B);

impl C {
    fn foo(self: Self) {
        consume_a(self.0);
        consume_b(self.1);
    }
}

fn main() {
    let c = Box::new(C(A, B));

    // Consume internals
    let _a = c.0;
    let _b = c.1;
}
error[E0382]: use of moved value: `c`
  --> src/main.rs:21:9
   |
20 |     let _a = c.0;
   |         -- value moved here
21 |     let _b = c.1;
   |         ^^ value used here after move
   |
   = note: move occurs because `c.0` has type `A`, which does not implement the `Copy` trait

Puedo lograr lo mismo (consumo de componentes internos) haciendo esto:

fn main() {
    let c = Box::new(C(A, B));
    c.foo();
}

La forma en que funciona arriba (c.foo()) significa que me he mudado fuera del contenido en caja; ¿Cómo puede suceder esto? Ninguna de las API enBoxLa documentación muestra que puedo obtener el valor contenido como un tipo (es decir, todos los métodos devuelven&T o&mut T pero noT)

Respuestas a la pregunta(2)

Su respuesta a la pregunta