Struct core::cell::UnsafeCell [] [src]

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

The core primitive for interior mutability in Rust.

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

Types like Cell<T> and RefCell<T> 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>'s fields are public to allow static initializers. It is not recommended to access its fields directly, 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>

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

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

All access to the inner value through methods is 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 this thread or another thread may currently be 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: ?Sized> UnsafeCell<T>

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: ?Sized> !Sync for UnsafeCell<T>