Struct std::raw::TraitObject[][src]

#[repr(C)]
pub struct TraitObject { pub data: *mut (), pub vtable: *mut (), }
👎 Deprecated since 1.53.0:

use pointer metadata APIs instead https://github.com/rust-lang/rust/issues/81513

🔬 This is a nightly-only experimental API. (raw #27751)
Expand description

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.

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: &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);
Run

Fields

data: *mut ()
👎 Deprecated since 1.53.0:

use pointer metadata APIs instead https://github.com/rust-lang/rust/issues/81513

🔬 This is a nightly-only experimental API. (raw #27751)
vtable: *mut ()
👎 Deprecated since 1.53.0:

use pointer metadata APIs instead https://github.com/rust-lang/rust/issues/81513

🔬 This is a nightly-only experimental API. (raw #27751)

Trait Implementations

impl Clone for TraitObject[src]

pub fn clone(&self) -> TraitObject[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl Copy for TraitObject[src]

Auto Trait Implementations

impl RefUnwindSafe for TraitObject

impl !Send for TraitObject

impl !Sync for TraitObject

impl Unpin for TraitObject

impl UnwindSafe for TraitObject

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

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.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.