
Size: a a a
#[lang_item]
— trait Pointee { type Metadata: ...; }
.Pointee
реализован для всех типов. Metadata
отвечает за тип метаданных (вау) в указателе (/ссылке) на этот тип. Для :Sized
и extern
типов Metadata = ()
, для str и [_]
Metadata = usize
, для dyn Trait
Metadata = DynMetadata<dyn Trait>
. Это значит что, например, &str
состоит из (*const (), usize)
.&T
(T: ?Sized
). Теперь можно — (*const (), <T as Pointee>::Metadata)
[0]ThinBox
, аналог Box
, но хранит метадату в куче?Sized
типов (у меня была идея что-то подобное написать, но на тот момент это было не возможно)dyn Trait
, а не то как делали раньше (через transmute
безопасность которого не гарантированна)