以下のトレイトは通常のコヒーレンス規則に加えて、特別なコヒーレンス規則が適用される。
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が成り立っている必要がある。