Namespaces
Variants

std::experimental::ranges:: EqualityComparable, std::experimental::ranges:: EqualityComparableWith

From cppreference.net
Определено в заголовочном файле <experimental/ranges/concepts>
template < class T >
concept bool EqualityComparable = WeaklyEqualityComparableWith < T, T > ;
(1) (ranges TS)
template < class T, class U >

concept bool EqualityComparableWith =
EqualityComparable < T > &&
EqualityComparable < U > &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
EqualityComparable <
ranges:: common_reference_t <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & >> &&

WeaklyEqualityComparableWith < T, U > ;
(2) (ranges TS)
1) Концепт EqualityComparable<T> определяет, что операторы сравнения == и != для типа T отражают отношение равенства: == возвращает true тогда и только тогда, когда операнды равны.
EqualityComparable<T> удовлетворяется только тогда, когда для объектов a и b типа T , bool ( a == b ) равно true тогда и только тогда, когда a и b равны. Вместе с требованием, что a == b сохраняет равенство, это подразумевает, что == является симметричным и транзитивным, и, кроме того, что == является рефлексивным для всех объектов a , которые равны хотя бы одному другому объекту.
2) Концепт EqualityComparableWith<T, U> определяет, что операторы сравнения == и != для (возможно, смешанных) операндов типов T и U дают результаты, соответствующие отношению равенства. Сравнение смешанных операндов дает результаты, эквивалентные сравнению операндов, приведенных к их общему типу.
Формально, EqualityComparableWith<T, U> выполняется только тогда, когда для любого lvalue t типа const std:: remove_reference_t < T > и любого lvalue u типа const std:: remove_reference_t < U > , и если C обозначает ranges:: common_reference_t < const std:: remove_reference_t < T > & , const std:: remove_reference_t < U > & > , bool ( t == u ) == bool ( C ( t ) == C ( u ) ) .

Сохранение равенства

Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.

  • Входные данные выражения состоят из его операндов.
  • Выходные данные выражения состоят из его результата и всех операндов, измененных выражением (если таковые имеются).

Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные результаты при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.

Вариации неявных выражений

Выражение requires-expression , использующее выражение, которое является неизменяемым для некоторого константного lvalue операнда, также неявно требует дополнительных вариаций этого выражения, принимающих неконстантный lvalue или (возможно константный) rvalue для данного операнда, если только такая вариация выражения не требуется явно с отличающейся семантикой. Эти неявные вариации выражений должны удовлетворять тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариаций, не определена.