Undecided. They will always be somewhat magical in that the "box" operator creates them by default. But the syntax for them may change, or be moved into the library.
E.g. the following is almost exactly identical to `~T`
#[unsafe_no_drop_flag]
struct Uniq<T> { priv ptr: *mut T }
impl<T> Uniq<T> {
fn new(value: T) -> Uniq<T> {
unsafe {
let ptr = malloc(size_of::<T>()) as *mut T;
if ptr.is_null() { fail!("malloc failed"); }
move_val_init(&mut *ptr, value);
Uniq { ptr: ptr }
}
}
fn borrow<'a>(&'a self) -> &'a T {
unsafe {&*self.ptr}
}
fn borrow_mut<'a>(&'a mut self) -> &'a mut T {
unsafe {&mut *self.ptr}
}
fn move(mut self) -> T {
unsafe {
let v = ptr::read_ptr(self.ptr as *T);
free(self.ptr);
self.ptr = 0;
v
}
}
}
#[unsafe_destructor]
impl<T> Drop for Uniq<T> {
fn drop(&mut self) {
unsafe {
// this will free the pointer and run the
// destructor of the inner type
replace(self, transmute(0)).move();
}
}
}