Rust組込みトレイトのコヒーレンス
以下のトレイトは通常のコヒーレンス規則に加えて、特別なコヒーレンス規則が適用される。
Sized
, Unsize
Sized
, Unsize
の手動実装を与えることはできない。
Fn
, FnMut
, FnOnce
Fn
, FnMut
, FnOnce
の手動実装は安定版では禁止されており、 #![feature(unboxed_closures)]
が必要である。
Drop
Drop
はユーザー定義の構造体・列挙型・共用体にのみ定義できる。
また、(なぜかコヒーレンスチェッカーではなくDropチェッカーの一部になっているが)Drop
は元の構造体・列挙型・共用体のジェネリクスを特殊化してはならない。これにより Drop
は、各ADT型に対して定義されるか、定義されないかのどちらかになる。
Copy
Self
はユーザー定義の構造体・列挙型・共用体である。- その
impl
に課された境界から、各フィールドがCopy
であることを結論づけられる。 - この構造体・列挙型・共用体は
Drop
を実装していない。
CoerceUnsized
CoerceUnsized
の実装は以下の条件を満たしている必要がある。
- 両辺ともポインタ/参照型であるか、両辺とも構造体である。
- ポインタ/参照型の場合、 (これは
libcore
で網羅されている)- ポインタからポインタ、ポインタから参照、参照から参照のいずれかである必要がある。
mut
からmut
,mut
からconst
,const
からconst
のいずれかである必要がある。- 参照から参照への場合は、大きいリージョン(部分型づけの意味では小さい)から小さいリージョン(部分型づけの意味では大きい)への変換である必要がある。
- 構造体の場合、
- 両辺が同じ定義を指している必要がある。
- 両辺のフィールドをそれぞれ単一化したとき、ちょうど1個だけが失敗する必要がある。
- 単一化が失敗したフィールドに対して同様に
CoerceUnsized
が成り立っている必要がある。