pub trait Sized { }
Expand description
在编译时已知大小为常量的类型。
所有类型参数都有一个 Sized
的隐式界限。如果不合适,可以使用特殊语法 ?Sized
删除这个界限。
struct Foo<T>(T);
struct Bar<T: ?Sized>(T);
// struct FooUse(Foo<[i32]>); // 错误:没有为 [i32] 实现 Sized
struct BarUse(Bar<[i32]>); // OK
Run一个例外是 trait 的隐式 Self
类型。
这个 trait 没有隐式的 Sized
界限,因为它与 trait 对象 不兼容,根据定义,trait 需要与所有可能的实现者一起工作,因此可以为任意大小。
尽管 Rust 可以让你将 Sized
绑定到一个 trait,但是以后您将无法使用它来生成 trait 对象:
trait Foo { }
trait Bar: Sized { }
struct Impl;
impl Foo for Impl { }
impl Bar for Impl { }
let x: &dyn Foo = &Impl; // OK
// let y: &dyn Bar = &Impl; // 错误:无法将 `Bar` trait 制作成对象
Run