+///
+/// Slices are also compared by their length (fat pointers):
+///
+/// ```
+/// let a = [1, 2, 3];
+/// assert!(std::ptr::eq(&a[..3], &a[..3]));
+/// assert!(!std::ptr::eq(&a[..2], &a[..3]));
+/// assert!(!std::ptr::eq(&a[0..2], &a[1..3]));
+/// ```
+///
+/// Traits are also compared by their implementation:
+///
+/// ```
+/// #[repr(transparent)]
+/// struct Wrapper { member: i32 }
+///
+/// trait Trait {}
+/// impl Trait for Wrapper {}
+/// impl Trait for i32 {}
+///
+/// fn main() {
+/// let wrapper = Wrapper { member: 10 };
+///
+/// // Pointers are equal address
+/// assert!(std::ptr::eq(
+/// &wrapper as *const Wrapper as *const u8,
+/// &wrapper.member as *const i32 as *const u8
+/// ));
+///
+/// // Objects have equal addresses, but `Trait` has different implementations
+/// assert!(!std::ptr::eq(
+/// &wrapper as &Trait,
+/// &wrapper.member as &Trait,
+/// ));
+/// assert!(!std::ptr::eq(
+/// &wrapper as &Trait as *const Trait,
+/// &wrapper.member as &Trait as *const Trait,
+/// ));
+///
+/// // Converting the reference to a `*const u8` compares by address
+/// assert!(std::ptr::eq(
+/// &wrapper as &Trait as *const Trait as *const u8,
+/// &wrapper.member as &Trait as *const Trait as *const u8,
+/// ));
+/// }
+/// ```