我认为我需要一种与 相反的特质Sized。任何不是的东西都Sized应该具有这个特征。我需要这个以避免在代码中其他地方针对大小类型和非大小类型以不同方式专门化另一个特征时发生冲突。在这种情况下使用?Sized不起作用,因为它会导致实现冲突。
为此,我定义了一个自动特征,然后T在 的情况下为 做了一个负暗示T: Sized。
我正在使用 rust-nightly 的功能auto_traits并在negative_impls以下位置打开main.rs:
#![feature(auto_traits)]
#![feature(negative_impls)]
Run Code Online (Sandbox Code Playgroud)
由于某种原因dyn Any没有实施Unsized,尽管也没有实施Sized。Sized自动实现中是否有一些隐含的要求?理想情况下,我希望每种类型都扩展Sized或Unsized不重叠。
#![feature(auto_traits)]
#![feature(negative_impls)]
Run Code Online (Sandbox Code Playgroud)
为什么Unsized对于那些明显没有实现的事物,该特征没有得到实现Sized?
删除负面实现会产生相同的断言结果。dyn Any还是不行Unsized。
dyn Traits 不会实现自动特征,除非它们在 ( dyn Any + Sync, dyn Any + Unsized) 中明确选择它们。
原因是,如果我们考虑自身,自动特征几乎没有价值dyn Trait,因为它没有有关实际类型的信息。通常,我们想要的是底层类型实现自动特征,而不是其dyn Trait本身。Sync例如,考虑一下:我们无法判断它是否dyn Any是Sync,因为我们不知道它包含什么数据。只有实际类型可以是Sync或不是。这就是为什么dyn Trait永远不要实现 auto 特征,除非用户明确表示它只会带来实现它的类型 ( dyn Trait + AutoTrait)。