Trait std::ops::CoerceUnsized[][src]

pub trait CoerceUnsized<T> where
    T: ?Sized
{ }
🔬 This is a nightly-only experimental API. (coerce_unsized #27732)
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> 的实现。 强制将通过将 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