#[repr(C)]pub struct TraitObject { pub data: *mut (), pub vtable: *mut (), }
The representation of a trait object like &dyn SomeTrait
.
This struct has the same layout as types like &dyn 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 &dyn SomeTrait
) nor does it control that layout (changing the definition will not change the layout of a &dyn 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.
#![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: &dyn 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: &dyn 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);
data: *mut ()
vtable: *mut ()
impl Clone for TraitObject
[src]
fn clone(&self) -> TraitObject
[src]
fn clone_from(&mut self, source: &Self)
[src]1.0.0
impl Copy for TraitObject
[src]
impl RefUnwindSafe for TraitObject
impl !Send for TraitObject
impl !Sync for TraitObject
impl Unpin for TraitObject
impl UnwindSafe for TraitObject
impl<T> Any for T where
    T: 'static + ?Sized,Â
[src]
impl<T> Borrow<T> for T where
    T: ?Sized,Â
[src]
fn borrow(&self) -> &TⓘNotable traits for &'_ mut F
impl<'_, F> Future for &'_ mut F where
    F: Unpin + Future + ?Sized,Â
type Output = <F as Future>::Output;
impl<'_, I> Iterator for &'_ mut I where
    I: Iterator + ?Sized,Â
type Item = <I as Iterator>::Item;
impl<R:Â Read + ?Sized, '_> Read for &'_ mut R
impl<W:Â Write + ?Sized, '_> Write for &'_ mut W
[src]
impl<T> BorrowMut<T> for T where
    T: ?Sized,Â
[src]
fn borrow_mut(&mut self) -> &mut TⓘNotable traits for &'_ mut F
impl<'_, F> Future for &'_ mut F where
    F: Unpin + Future + ?Sized,Â
type Output = <F as Future>::Output;
impl<'_, I> Iterator for &'_ mut I where
    I: Iterator + ?Sized,Â
type Item = <I as Iterator>::Item;
impl<R:Â Read + ?Sized, '_> Read for &'_ mut R
impl<W:Â Write + ?Sized, '_> Write for &'_ mut W
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
    U: From<T>,Â
[src]
impl<T> ToOwned for T where
    T: Clone,Â
[src]
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
    U: Into<T>,Â
[src]
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
    U: TryFrom<T>,Â
[src]
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/raw/struct.TraitObject.html