Trait std::ops::CoerceUnsized

source ·
pub trait CoerceUnsized<T>where
    T: ?Sized,{ }
🔬This is a nightly-only experimental API. (coerce_unsized #18598)
Expand description

一个 trait,指示这是一个指针或一个包装器,其中可以对指针调整大小。

有关更多详细信息,请参见 DST 强制 RFC关于强制的 nomicon 入口

对于内置指针类型,如果 T: Unsize<U> 通过从精简指针转换为胖指针,则指向 T 的指针将强制指向指向 U 的指针。

对于自定义类型,这里的强制通过将 Foo<T> 强制为 Foo<U> 来工作 (如果存在 CoerceUnsized<Foo<U>> for Foo<T> 的实现)。 仅当 Foo<T> 仅具有涉及 T 的单个非虚拟数据字段时,才可以写这样的 impl。 如果该字段的类型为 Bar<T>,则必须存在 CoerceUnsized<Bar<U>> for Bar<T> 的实现。 coercion 将通过将 Bar<T> 字段强制转换为 Bar<U> 并填充 Foo<T> 的其余字段以创建 Foo<U> 来起作用。 这将有效地向下钻取指针字段并将其强制。

通常,对于智能指针,您将实现 CoerceUnsized<Ptr<U>> for Ptr<T> where T: Unsize<U>, U: ?Sized,并在 T 本身上绑定了可选的 ?Sized。 对于直接嵌入 T 的包装器类型 (例如 Cell<T>RefCell<T>),您可以直接实现 CoerceUnsized<Wrap<U>> for Wrap<T> where T: CoerceUnsized<U>

这将使像 Cell<Box<T>> 这样的强制类型起作用。

Unsize 用于标记在指针后面可以强制转换为 DST 的类型。它由编译器自动实现。

Implementors§

source§

impl<'a, 'b, T, U> CoerceUnsized<&'a U> for &'b Twhere 'b: 'a, T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'a, 'b, T, U> CoerceUnsized<&'a U> for &'b mut Twhere 'b: 'a, T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'a, T, U> CoerceUnsized<*const U> for &'a Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'a, T, U> CoerceUnsized<*const U> for &'a mut Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'a, T, U> CoerceUnsized<*mut U> for &'a mut Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'a, T, U> CoerceUnsized<&'a mut U> for &'a mut Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'b, T, U> CoerceUnsized<Ref<'b, U>> for Ref<'b, T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<'b, T, U> CoerceUnsized<RefMut<'b, U>> for RefMut<'b, T>where T: Unsize<U> + ?Sized, U: ?Sized,

1.33.0 · source§

impl<P, U> CoerceUnsized<Pin<U>> for Pin<P>where P: CoerceUnsized<U>,

source§

impl<T, U> CoerceUnsized<*const U> for *const Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<*const U> for *mut Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<*mut U> for *mut Twhere T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<Cell<U>> for Cell<T>where T: CoerceUnsized<U>,

source§

impl<T, U> CoerceUnsized<RefCell<U>> for RefCell<T>where T: CoerceUnsized<U>,

source§

impl<T, U> CoerceUnsized<SyncUnsafeCell<U>> for SyncUnsafeCell<T>where T: CoerceUnsized<U>,

source§

impl<T, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T>where T: CoerceUnsized<U>,

source§

impl<T, U> CoerceUnsized<NonNull<U>> for NonNull<T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<Rc<U>> for Rc<T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<Weak<U>> for std::rc::Weak<T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<Arc<U>> for Arc<T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U> CoerceUnsized<Weak<U>> for std::sync::Weak<T>where T: Unsize<U> + ?Sized, U: ?Sized,

source§

impl<T, U, A> CoerceUnsized<Box<U, A>> for Box<T, A>where T: Unsize<U> + ?Sized, A: Allocator, U: ?Sized,