HiveBrain v1.2.0
Get Started
← Back to all entries
snippetrustCritical

How do I get an owned value out of a `Box`?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
boxhowvalueownedoutget

Problem

What is the implementation for this function:

fn unbox(value: Box) -> T {
    // ???
}


The only function in the documentation that looks like what I want is Box::into_raw. The following will type check:

fn unbox(value: Box) -> T {
    *value.into_raw()
}


This gives the error error[E0133]: dereference of raw pointer requires unsafe function or block. Wrapping it in an unsafe { ... } block fixes it.

fn unbox(value: Box) -> T {
    unsafe { *value.into_raw() }
}


Is this the correct implementation? If so, why is it unsafe? What does it mean?

Perhaps this question shows my general uncertainty of how Boxs actually work.

Solution

Dereference the value:
fn unbox(value: Box) -> T {
*value
}


There's a nightly associated function into_inner you can use as well:
#![feature(box_into_inner)]
fn unbox(value: Box) -> T {
Box::into_inner(value)
}


Way back in pre-1.0 Rust, heap-allocated values were very special types, and they used the sigil ~ (as in ~T). Along the road to Rust 1.0, most of this special-casing was removed... but not all of it.

This particular specialty goes by the name "deref move", and there's a proto-RFC about supporting it as a first-class concept. Until then, the answer is "because Box is special".

See also:

  • Dereferencing Box gives back value instead of reference

Context

Stack Overflow Q#42264041, score: 153

Revisions (0)

No revisions yet.