Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

rust

unsafe

What is the implementation for this function:

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

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

fn unbox<T>(value: Box<T>) -> 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<T>(value: Box<T>) -> 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.

like image 744
Calebmer Avatar asked Feb 16 '17 03:02

Calebmer


Video Answer


1 Answers

Dereference the value:

fn unbox<T>(value: Box<T>) -> T {     *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 speciality 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<T> gives back value instead of reference
like image 152
Shepmaster Avatar answered Oct 14 '22 15:10

Shepmaster