From cppreference.com
template<classF,classI1,classI2=I1>conceptindirect_equivalence_relation=std::indirectly_readable<I1>&&std::indirectly_readable<I2>&&std::copy_constructible<F>&&std::equivalence_relation<F&,/*indirect-value-t*/<I1>,/*indirect-value-t*/<I2>>&&std::equivalence_relation<F&,/*indirect-value-t*/<I1>,std::iter_reference_t<I2>>&&std::equivalence_relation<F&,std::iter_reference_t<I1>,/*indirect-value-t*/<I2>>&&std::equivalence_relation<F&,std::iter_reference_t<I1>,std::iter_reference_t<I2>>;(since C++20)The concept indirect_equivalence_relation specifies requirements for algorithms that call equivalence relations as their arguments. The key difference between this concept and
is that it is applied to the types that I1 and I2 references, rather than I1 and I2 themselves.
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++20 some requirements were defined in terms of std::iter_value_t<I>&
which mishandled projections resulting in incompatibility with equivalence relation F&defined in terms of /*indirect-value-t*/<I>
to correctly handle such projections
C++20 indirect_equivalence_relation required F& to satisfy
with
std::iter_common_reference_t<I>does not require