# Trait core::marker::StructuralEq[−][src]

    #[lang = "structural_teq"]pub trait StructuralEq { }

🔬 This is a nightly-only experimental API. (`structural_match` #31434)

Required trait for constants used in pattern matches.

Any type that derives `Eq` automatically implements this trait, regardless of whether its type parameters implement `Eq`.

This is a hack to work around a limitation in our type system.

# Background

We want to require that types of consts used in pattern matches have the attribute `#[derive(PartialEq, Eq)]`.

In a more ideal world, we could check that requirement by just checking that the given type implements both the `StructuralPartialEq` trait and the `Eq` trait. However, you can have ADTs that do `derive(PartialEq, Eq)`, and be a case that we want the compiler to accept, and yet the constant's type fails to implement `Eq`.

Namely, a case like this:

    #[derive(PartialEq, Eq)]
    struct Wrap<X>(X);

    fn higher_order(_: &()) { }

    const CFN: Wrap<fn(&())> = Wrap(higher_order);

    fn main() {
        match CFN {
            CFN => {}
            _ => {}
        }
    }

Run

(The problem in the above code is that `Wrap<fn(&())>` does not implement `PartialEq`, nor `Eq`, because `for<'a> fn(&'a _)` does not implement those traits.)

Therefore, we cannot rely on naive check for `StructuralPartialEq` and mere `Eq`.

As a hack to work around this, we use two separate traits injected by each of the two derives (`#[derive(PartialEq)]` and `#[derive(Eq)]`) and check that both of them are present as part of structural-match checking.

## Implementors

### `impl StructuralEq for FpCategory` 1.0.0[src]

### `impl StructuralEq for IntErrorKind`[src]

### `impl StructuralEq for SearchStep`[src]

### `impl StructuralEq for Ordering` 1.0.0[src]

### `impl StructuralEq for AllocError`[src]

### `impl StructuralEq for Layout` 1.28.0[src]

### `impl StructuralEq for LayoutError` 1.50.0[src]

### `impl StructuralEq for TypeId` 1.0.0[src]

### `impl StructuralEq for CpuidResult` 1.27.0[src]

This is supported on x86 or x86-64 only.

### `impl StructuralEq for CharTryFromError` 1.34.0[src]

### `impl StructuralEq for DecodeUtf16Error` 1.9.0[src]

### `impl StructuralEq for ParseCharError` 1.20.0[src]

### `impl StructuralEq for Error` 1.0.0[src]

### `impl StructuralEq for PhantomPinned` 1.33.0[src]

### `impl StructuralEq for NonZeroI8` 1.34.0[src]

### `impl StructuralEq for NonZeroI16` 1.34.0[src]

### `impl StructuralEq for NonZeroI32` 1.34.0[src]

### `impl StructuralEq for NonZeroI64` 1.34.0[src]

### `impl StructuralEq for NonZeroI128` 1.34.0[src]

### `impl StructuralEq for NonZeroIsize` 1.34.0[src]

### `impl StructuralEq for NonZeroU8` 1.28.0[src]

### `impl StructuralEq for NonZeroU16` 1.28.0[src]

### `impl StructuralEq for NonZeroU32` 1.28.0[src]

### `impl StructuralEq for NonZeroU64` 1.28.0[src]

### `impl StructuralEq for NonZeroU128` 1.28.0[src]

### `impl StructuralEq for NonZeroUsize` 1.28.0[src]

### `impl StructuralEq for ParseFloatError` 1.0.0[src]

### `impl StructuralEq for ParseIntError` 1.0.0[src]

### `impl StructuralEq for TryFromIntError` 1.34.0[src]

### `impl StructuralEq for RangeFull` 1.0.0[src]

### `impl StructuralEq for NoneError`[src]

### `impl StructuralEq for ParseBoolError` 1.0.0[src]

### `impl StructuralEq for Utf8Error` 1.0.0[src]

### `impl StructuralEq for Duration` 1.3.0[src]

### `impl<'a> StructuralEq for Location<'a>`1.10.0[src]

### `impl<'a> StructuralEq for Utf8LossyChunk<'a>`[src]

### `impl<Idx> StructuralEq for Range<Idx>`1.0.0[src]

### `impl<Idx> StructuralEq for RangeFrom<Idx>`1.0.0[src]

### `impl<Idx> StructuralEq for RangeInclusive<Idx>`1.26.0[src]

### `impl<Idx> StructuralEq for RangeTo<Idx>`1.0.0[src]

### `impl<Idx> StructuralEq for RangeToInclusive<Idx>`1.26.0[src]

### `impl<T> StructuralEq for Bound<T>`1.17.0[src]

### `impl<T> StructuralEq for Option<T>`1.0.0[src]

### `impl<T> StructuralEq for Poll<T>`1.36.0[src]

### `impl<T> StructuralEq for Reverse<T>`1.19.0[src]

### `impl<T> StructuralEq for Wrapping<T>`1.0.0[src]

### `impl<T, E> StructuralEq for Result<T, E>`1.0.0[src]

### `impl<T: ?Sized> StructuralEq for PhantomData<T>`[src]

### `impl<T: ?Sized> StructuralEq for ManuallyDrop<T>`1.20.0[src]

### `impl<Y, R> StructuralEq for GeneratorState<Y, R>`[src]

Loading content...