Difference between revisions of "cpp/iterator/sized sentinel for"
m (→See also: P1754R1) |
(Links to the definition of “program-defined type”. The standard never requires the complexity of iterator-sentinel subtraction to be constant.) |
||
(One intermediate revision by one user not shown) | |||
Line 2: | Line 2: | ||
{{cpp/iterator/navbar}} | {{cpp/iterator/navbar}} | ||
{{dcl begin}} | {{dcl begin}} | ||
− | {{dcl header | iterator}} | + | {{dcl header|iterator}} |
− | {{dcl | num=1 | since=c++20 | 1= | + | {{dcl|num=1|since=c++20|1= |
− | template<class S, class I> | + | template< class S, class I > |
− | + | concept sized_sentinel_for = | |
− | + | std::sentinel_for<S, I> && | |
− | + | !std::disable_sized_sentinel_for<std::remove_cv_t<S>, | |
− | + | std::remove_cv_t<I>> && | |
− | + | requires(const I& i, const S& s) { | |
− | + | { s - i } -> std::same_as<std::iter_difference_t<I>>; | |
− | + | { i - s } -> std::same_as<std::iter_difference_t<I>>; | |
+ | }; | ||
}} | }} | ||
− | {{dcl | num=2 | since=c++20 | 1= | + | {{dcl|num=2|since=c++20|1= |
− | template<class S, class I> | + | template< class S, class I > |
− | + | inline constexpr bool disable_sized_sentinel_for = false; | |
}} | }} | ||
{{dcl end}} | {{dcl end}} | ||
− | @1@ The {{tt|sized_sentinel_for}} concept specifies that an object of the iterator type {{tt|I}} and an object of the sentinel type {{tt|S}} can be subtracted to compute the distance between them in constant time | + | @1@ The {{tt|sized_sentinel_for}} concept specifies that an object of the iterator type {{tt|I}} and an object of the sentinel type {{tt|S}} can be subtracted to compute the distance between them in constant time. |
− | + | ||
− | + | ||
− | + | @2@ The {{tt|disable_sized_sentinel_for}} variable template can be used to prevent iterators and sentinels that can be subtracted but do not actually model {{tt|sized_sentinel_for}} from satisfying the concept. | |
− | + | @@ A program may specialize {{tt|disable_sized_sentinel_for}} for cv-unqualified non-array object type {{tt|S}} and {{tt|I}}, as long as at least one of which is a {{lsd|cpp/language/type#Program-defined type}}. Such specializations are usable in {{lt|cpp/language/constant expression}}s and have type {{c/core|const bool}}. | |
− | * If {{ | + | ===Semantic requirements=== |
− | * If {{ | + | Let {{c|i}} be an iterator of type {{tt|I}}, and {{c|s}} a sentinel of type {{tt|S}} such that {{range|i|s}} denotes a range. Let {{c|n}} be the smallest number of applications of {{c|++i}} necessary to make {{c|1=bool(i == s)}} be {{c|true}}. {{tt|I}} and {{tt|S}} model {{tt|sized_sentinel_for<S, I>}} only if all following conditions are satisfied: |
− | + | * If {{c|n}} is representable by {{c/core|std::iter_difference_t<I>}}, then {{c|s - i}} is well-defined and equals {{c|n}}. | |
+ | * If {{c|-n}} is representable by {{c/core|std::iter_difference_t<I>}}, then {{c|i - s}} is well-defined and equals {{c|-n}}. | ||
{{cpp/concepts/equality preservation}} | {{cpp/concepts/equality preservation}} | ||
Line 35: | Line 35: | ||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/ranges/dsc sized_range}} | + | {{dsc inc|cpp/ranges/dsc sized_range}} |
− | {{dsc inc | cpp/ranges/dsc size}} | + | {{dsc inc|cpp/ranges/dsc size}} |
{{dsc end}} | {{dsc end}} | ||
{{langlinks|de|es|ja|ru|zh}} | {{langlinks|de|es|ja|ru|zh}} |
Latest revision as of 17:49, 13 March 2024
Defined in header <iterator>
|
||
template< class S, class I > concept sized_sentinel_for = |
(1) | (since C++20) |
template< class S, class I > inline constexpr bool disable_sized_sentinel_for = false; |
(2) | (since C++20) |
sized_sentinel_for
concept specifies that an object of the iterator type I
and an object of the sentinel type S
can be subtracted to compute the distance between them in constant time.disable_sized_sentinel_for
variable template can be used to prevent iterators and sentinels that can be subtracted but do not actually model sized_sentinel_for
from satisfying the concept.disable_sized_sentinel_for
for cv-unqualified non-array object type S
and I
, as long as at least one of which is a program-defined type. Such specializations are usable in constant expressions and have type const bool.Contents |
[edit] Semantic requirements
Let i be an iterator of type I
, and s a sentinel of type S
such that [
i,
s)
denotes a range. Let n be the smallest number of applications of ++i necessary to make bool(i == s) be true. I
and S
model sized_sentinel_for<S, I>
only if all following conditions are satisfied:
- If n is representable by std::iter_difference_t<I>, then s - i is well-defined and equals n.
- If -n is representable by std::iter_difference_t<I>, then i - s is well-defined and equals -n.
[edit] Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
[edit] Implicit expression variations
A requires expression that uses an expression that is non-modifying for some constant lvalue operand also requires implicit expression variations.
[edit] See also
(C++20) |
specifies that a range knows its size in constant time (concept) |
(C++20) |
returns an integer equal to the size of a range (customization point object) |