[−][src]Struct core::raw::TraitObject
The representation of a trait object like &SomeTrait
.
This struct has the same layout as types like &SomeTrait
and
Box<dyn AnotherTrait>
.
TraitObject
is guaranteed to match layouts, but it is not the
type of trait objects (e.g., the fields are not directly accessible
on a &SomeTrait
) nor does it control that layout (changing the
definition will not change the layout of a &SomeTrait
). It is
only designed to be used by unsafe code that needs to manipulate
the low-level details.
There is no way to refer to all trait objects generically, so the only
way to create values of this type is with functions like
std::mem::transmute
. Similarly, the only way to create a true
trait object from a TraitObject
value is with transmute
.
Synthesizing a trait object with mismatched types—one where the vtable does not correspond to the type of the value to which the data pointer points—is highly likely to lead to undefined behavior.
Examples
#![feature(raw)] use std::{mem, raw}; // an example trait trait Foo { fn bar(&self) -> i32; } impl Foo for i32 { fn bar(&self) -> i32 { *self + 1 } } let value: i32 = 123; // let the compiler make a trait object let object: &Foo = &value; // look at the raw representation let raw_object: raw::TraitObject = unsafe { mem::transmute(object) }; // the data pointer is the address of `value` assert_eq!(raw_object.data as *const i32, &value as *const _); let other_value: i32 = 456; // construct a new object, pointing to a different `i32`, being // careful to use the `i32` vtable from `object` let synthesized: &Foo = unsafe { mem::transmute(raw::TraitObject { data: &other_value as *const _ as *mut (), vtable: raw_object.vtable, }) }; // it should work just as if we had constructed a trait object out of // `other_value` directly assert_eq!(synthesized.bar(), 457);Run
Fields
data: *mut ()
vtable: *mut ()
Trait Implementations
impl Copy for TraitObject
[src]
impl Clone for TraitObject
[src]
fn clone(&self) -> TraitObject
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
Performs copy-assignment from source
. Read more
Auto Trait Implementations
impl !Send for TraitObject
impl !Sync for TraitObject
Blanket Implementations
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> From<T> for T
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(Self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut Self) -> &mut T
[src]
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,