Struct std::cell::UnsafeCell [] [src]

pub struct UnsafeCell<T> where T: ?Sized {
    pub value: T,
}

The core primitive for interior mutability in Rust.

UnsafeCell<T>`UnsafeCellis a type that wraps some` is a type that wraps some T`Tand indicates unsafe interior operations on the wrapped type. Types with an` and indicates unsafe interior operations on the wrapped type. Types with an UnsafeCell<T>`UnsafeCellfield are considered to have an 'unsafe interior'. The` field are considered to have an 'unsafe interior'. The UnsafeCell<T>`UnsafeCelltype is the only legal way to obtain aliasable data that is considered mutable. In general, transmuting an` type is the only legal way to obtain aliasable data that is considered mutable. In general, transmuting an &T`&Ttype into an` type into an &mut T`&mut T` is considered undefined behavior.

Types like Cell<T>`Celland` and RefCell<T>`RefCell` use this type to wrap their internal data.

Examples

fn main() { use std::cell::UnsafeCell; use std::marker::Sync; struct NotThreadSafe<T> { value: UnsafeCell<T>, } unsafe impl<T> Sync for NotThreadSafe<T> {} }
use std::cell::UnsafeCell;
use std::marker::Sync;

struct NotThreadSafe<T> {
    value: UnsafeCell<T>,
}

unsafe impl<T> Sync for NotThreadSafe<T> {}

NOTE: UnsafeCell<T>`UnsafeCell's fields are public to allow static initializers. It is not recommended to access its fields directly,`'s fields are public to allow static initializers. It is not recommended to access its fields directly, get`get` should be used instead.

Fields

value
Unstable

Wrapped value

This field should not be accessed directly, it is made public for static initializers.

Methods

impl<T> UnsafeCell<T>

fn new(value: T) -> UnsafeCell<T>

Constructs a new instance of UnsafeCell`UnsafeCell` which will wrap the specified value.

All access to the inner value through methods is unsafe`unsafe`, and it is highly discouraged to access the fields directly.

Examples

fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); }
use std::cell::UnsafeCell;

let uc = UnsafeCell::new(5);

unsafe fn into_inner(self) -> T

Unwraps the value.

Unsafety

This function is unsafe because there is no guarantee that this or other threads are currently inspecting the inner value.

Examples

fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = unsafe { uc.into_inner() }; }
use std::cell::UnsafeCell;

let uc = UnsafeCell::new(5);

let five = unsafe { uc.into_inner() };

impl<T> UnsafeCell<T> where T: ?Sized

fn get(&self) -> *mut T

Gets a mutable pointer to the wrapped value.

Examples

fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = uc.get(); }
use std::cell::UnsafeCell;

let uc = UnsafeCell::new(5);

let five = uc.get();

Trait Implementations

impl<T> !Sync for UnsafeCell<T> where T: ?Sized