Rollup merge of #59390 - czipperz:ptr_eq_smart_pointer, r=Centril,steveklabnik
Make `ptr::eq` documentation mention fat-pointer behavior Resolves #59214
This commit is contained in:
commit
35b339bd5f
1 changed files with 48 additions and 2 deletions
|
|
@ -2495,11 +2495,57 @@ impl<T: ?Sized> Eq for *mut T {}
|
|||
/// let other_five_ref = &other_five;
|
||||
///
|
||||
/// assert!(five_ref == same_five_ref);
|
||||
/// assert!(five_ref == other_five_ref);
|
||||
///
|
||||
/// assert!(ptr::eq(five_ref, same_five_ref));
|
||||
///
|
||||
/// assert!(five_ref == other_five_ref);
|
||||
/// assert!(!ptr::eq(five_ref, other_five_ref));
|
||||
/// ```
|
||||
///
|
||||
/// 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 have equal addresses.
|
||||
/// 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 &dyn Trait,
|
||||
/// &wrapper.member as &dyn Trait,
|
||||
/// ));
|
||||
/// assert!(!std::ptr::eq(
|
||||
/// &wrapper as &dyn Trait as *const dyn Trait,
|
||||
/// &wrapper.member as &dyn Trait as *const dyn Trait,
|
||||
/// ));
|
||||
///
|
||||
/// // Converting the reference to a `*const u8` compares by address.
|
||||
/// assert!(std::ptr::eq(
|
||||
/// &wrapper as &dyn Trait as *const dyn Trait as *const u8,
|
||||
/// &wrapper.member as &dyn Trait as *const dyn Trait as *const u8,
|
||||
/// ));
|
||||
/// }
|
||||
/// ```
|
||||
#[stable(feature = "ptr_eq", since = "1.17.0")]
|
||||
#[inline]
|
||||
pub fn eq<T: ?Sized>(a: *const T, b: *const T) -> bool {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue