Files
2025-10-25 03:02:53 +03:00

181 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[concepts.callable]
# 18 Concepts library [[concepts]](./#concepts)
## 18.7 Callable concepts [concepts.callable]
### [18.7.1](#general) General [[concepts.callable.general]](concepts.callable.general)
[1](#general-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1209)
The concepts in [concepts.callable] describe the requirements on function
objects ([[function.objects]](function.objects "22.10Function objects")) and their arguments[.](#general-1.sentence-1)
### [18.7.2](#concept.invocable) Concept invocable [[concept.invocable]](concept.invocable)
[1](#concept.invocable-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1215)
The [invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]") concept specifies a relationship between a callable
type ([[func.def]](func.def "22.10.3Definitions")) F and a set of argument types Args... which
can be evaluated by the library function invoke ([[func.invoke]](func.invoke "22.10.5invoke functions"))[.](#concept.invocable-1.sentence-1)
[🔗](#concept:invocable)
`template<class F, class... Args>
concept [invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]") = requires(F&& f, Args&&... args) {
invoke(std::forward<F>(f), std::forward<Args>(args)...); // not required to be equality-preserving
};
`
[2](#concept.invocable-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1228)
[*Example [1](#concept.invocable-example-1)*:
A function that generates random numbers can model [invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]"),
since the invoke function call expression is not required to be
equality-preserving ([[concepts.equality]](concepts.equality "18.2Equality preservation"))[.](#concept.invocable-2.sentence-1)
— *end example*]
### [18.7.3](#concept.regularinvocable) Concept regular_invocable [[concept.regularinvocable]](concept.regularinvocable)
[🔗](#concept:regular_invocable)
`template<class F, class... Args>
concept [regular_invocable](#concept:regular_invocable "18.7.3Concept regular_­invocable[concept.regularinvocable]") = [invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]")<F, Args...>;
`
[1](#concept.regularinvocable-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1244)
The invoke function call expression shall be
equality-preserving ([[concepts.equality]](concepts.equality "18.2Equality preservation")) and
shall not modify the function object or the arguments[.](#concept.regularinvocable-1.sentence-1)
[*Note [1](#concept.regularinvocable-note-1)*:
This requirement supersedes the annotation in the definition of[invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]")[.](#concept.regularinvocable-1.sentence-2)
— *end note*]
[2](#concept.regularinvocable-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1253)
[*Example [1](#concept.regularinvocable-example-1)*:
A random number generator does not model [regular_invocable](#concept:regular_invocable "18.7.3Concept regular_­invocable[concept.regularinvocable]")[.](#concept.regularinvocable-2.sentence-1)
— *end example*]
[3](#concept.regularinvocable-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1258)
[*Note [2](#concept.regularinvocable-note-2)*:
The distinction between [invocable](#concept:invocable "18.7.2Concept invocable[concept.invocable]") and [regular_invocable](#concept:regular_invocable "18.7.3Concept regular_­invocable[concept.regularinvocable]") is purely semantic[.](#concept.regularinvocable-3.sentence-1)
— *end note*]
### [18.7.4](#concept.predicate) Concept predicate [[concept.predicate]](concept.predicate)
[🔗](#concept:predicate)
`template<class F, class... Args>
concept [predicate](#concept:predicate "18.7.4Concept predicate[concept.predicate]") =
[regular_invocable](#concept:regular_invocable "18.7.3Concept regular_­invocable[concept.regularinvocable]")<F, Args...> && [boolean-testable](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]")<invoke_result_t<F, Args...>>;
`
### [18.7.5](#concept.relation) Concept relation [[concept.relation]](concept.relation)
[🔗](#concept:relation)
`template<class R, class T, class U>
concept [relation](#concept:relation "18.7.5Concept relation[concept.relation]") =
[predicate](#concept:predicate "18.7.4Concept predicate[concept.predicate]")<R, T, T> && [predicate](#concept:predicate "18.7.4Concept predicate[concept.predicate]")<R, U, U> &&
[predicate](#concept:predicate "18.7.4Concept predicate[concept.predicate]")<R, T, U> && [predicate](#concept:predicate "18.7.4Concept predicate[concept.predicate]")<R, U, T>;
`
### [18.7.6](#concept.equiv) Concept equivalence_relation [[concept.equiv]](concept.equiv)
[🔗](#concept:equivalence_relation)
`template<class R, class T, class U>
concept [equivalence_relation](#concept:equivalence_relation "18.7.6Concept equivalence_­relation[concept.equiv]") = [relation](#concept:relation "18.7.5Concept relation[concept.relation]")<R, T, U>;
`
[1](#concept.equiv-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1290)
A [relation](#concept:relation "18.7.5Concept relation[concept.relation]") models [equivalence_relation](#concept:equivalence_relation "18.7.6Concept equivalence_­relation[concept.equiv]") only if
it imposes an equivalence relation on its arguments[.](#concept.equiv-1.sentence-1)
### [18.7.7](#concept.strictweakorder) Concept strict_weak_order [[concept.strictweakorder]](concept.strictweakorder)
[🔗](#concept:strict_weak_order)
`template<class R, class T, class U>
concept [strict_weak_order](#concept:strict_weak_order "18.7.7Concept strict_­weak_­order[concept.strictweakorder]") = [relation](#concept:relation "18.7.5Concept relation[concept.relation]")<R, T, U>;
`
[1](#concept.strictweakorder-1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1303)
A [relation](#concept:relation "18.7.5Concept relation[concept.relation]") models [strict_weak_order](#concept:strict_weak_order "18.7.7Concept strict_­weak_­order[concept.strictweakorder]") only if
it imposes a [*strict weak ordering*](#def:strict_weak_ordering) on its arguments[.](#concept.strictweakorder-1.sentence-1)
[2](#concept.strictweakorder-2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1307)
The term[*strict*](#def:strict) refers to the
requirement of an irreflexive relation (!comp(x, x) for all x),
and the term[*weak*](#def:weak) to requirements that are not as strong as
those for a total ordering,
but stronger than those for a partial
ordering[.](#concept.strictweakorder-2.sentence-1)
If we defineequiv(a, b) as!comp(a, b) && !comp(b, a),
then the requirements are thatcomp andequiv both be transitive relations:
- [(2.1)](#concept.strictweakorder-2.1)
comp(a, b) && comp(b, c) impliescomp(a, c)
- [(2.2)](#concept.strictweakorder-2.2)
equiv(a, b) && equiv(b, c) impliesequiv(a, c)
[3](#concept.strictweakorder-3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/concepts.tex#L1338)
[*Note [1](#concept.strictweakorder-note-1)*:
Under these conditions, it can be shown that
- [(3.1)](#concept.strictweakorder-3.1)
equiv is an equivalence relation,
- [(3.2)](#concept.strictweakorder-3.2)
comp induces a well-defined relation on the equivalence
classes determined byequiv, and
- [(3.3)](#concept.strictweakorder-3.3)
the induced relation is a strict total ordering[.](#concept.strictweakorder-3.sentence-1)
— *end note*]