The indirect callable concepts are used to constrain those algorithms
that accept callable objects (
[func.def]) as arguments
.
namespace std {
template<class F, class I>
concept IndirectUnaryInvocable =
Readable<I> &&
CopyConstructible<F> &&
Invocable<F&, iter_value_t<I>&> &&
Invocable<F&, iter_reference_t<I>> &&
Invocable<F&, iter_common_reference_t<I>> &&
CommonReference<
invoke_result_t<F&, iter_value_t<I>&>,
invoke_result_t<F&, iter_reference_t<I>>>;
template<class F, class I>
concept IndirectRegularUnaryInvocable =
Readable<I> &&
CopyConstructible<F> &&
RegularInvocable<F&, iter_value_t<I>&> &&
RegularInvocable<F&, iter_reference_t<I>> &&
RegularInvocable<F&, iter_common_reference_t<I>> &&
CommonReference<
invoke_result_t<F&, iter_value_t<I>&>,
invoke_result_t<F&, iter_reference_t<I>>>;
template<class F, class I>
concept IndirectUnaryPredicate =
Readable<I> &&
CopyConstructible<F> &&
Predicate<F&, iter_value_t<I>&> &&
Predicate<F&, iter_reference_t<I>> &&
Predicate<F&, iter_common_reference_t<I>>;
template<class F, class I1, class I2 = I1>
concept IndirectRelation =
Readable<I1> && Readable<I2> &&
CopyConstructible<F> &&
Relation<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
Relation<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
Relation<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
Relation<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
Relation<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
template<class F, class I1, class I2 = I1>
concept IndirectStrictWeakOrder =
Readable<I1> && Readable<I2> &&
CopyConstructible<F> &&
StrictWeakOrder<F&, iter_value_t<I1>&, iter_value_t<I2>&> &&
StrictWeakOrder<F&, iter_value_t<I1>&, iter_reference_t<I2>> &&
StrictWeakOrder<F&, iter_reference_t<I1>, iter_value_t<I2>&> &&
StrictWeakOrder<F&, iter_reference_t<I1>, iter_reference_t<I2>> &&
StrictWeakOrder<F&, iter_common_reference_t<I1>, iter_common_reference_t<I2>>;
}