The invocable concept specifies a relationship between a callable
type ([func.def]) F and a set of argument types Args... which
can be evaluated by the library function invoke ([func.invoke]).
template<class F, class... Args>conceptinvocable=requires(F&& f, Args&&... args){
invoke(std::forward<F>(f), std::forward<Args>(args)...); // not required to be equality-preserving};
A function that generates random numbers can model invocable,
since the invoke function call expression is not required to be
equality-preserving ([concepts.equality]).
The term
strict
refers to the
requirement of an irreflexive relation (!comp(x, x) for all x),
and the term
weak
to requirements that are not as strong as
those for a total ordering,
but stronger than those for a partial
ordering.
If we define
equiv(a, b)
as
!comp(a, b)&&!comp(b, a),
then the requirements are that
comp
and
equiv
both be transitive relations: