The
strong_equality type is typically used
as the result type of a
three-way comparison operator
that (a) admits only equality and inequality comparisons,
and (b) does imply substitutability
.
namespace std {
class strong_equality {
int value;
explicit constexpr strong_equality(eq v) noexcept : value(int(v)) {}
public:
static const strong_equality equal;
static const strong_equality nonequal;
static const strong_equality equivalent;
static const strong_equality nonequivalent;
constexpr operator weak_equality() const noexcept;
friend constexpr bool operator==(strong_equality v, unspecified) noexcept;
friend constexpr bool operator!=(strong_equality v, unspecified) noexcept;
friend constexpr bool operator==(unspecified, strong_equality v) noexcept;
friend constexpr bool operator!=(unspecified, strong_equality v) noexcept;
friend constexpr strong_equality operator<=>(strong_equality v, unspecified) noexcept;
friend constexpr strong_equality operator<=>(unspecified, strong_equality v) noexcept;
};
inline constexpr strong_equality strong_equality::equal(eq::equal);
inline constexpr strong_equality strong_equality::nonequal(eq::nonequal);
inline constexpr strong_equality strong_equality::equivalent(eq::equivalent);
inline constexpr strong_equality strong_equality::nonequivalent(eq::nonequivalent);
}