Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/iterator/sized sentinel for"

From cppreference.com
< cpp‎ | iterator
 
m
Line 20: Line 20:
  
 
@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}} to satisfy the concept.<br>
+
@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.<br>
 
The variable template is allowed to be specialized for cv-unqualified non-array object type {{tt|S}} and {{tt|I}}, as long as at least one of which is a program-defined type. Such specializations shall be usable in [[cpp/language/constant expression|constant expressions]] and have type {{c|const bool}}.
 
The variable template is allowed to be specialized for cv-unqualified non-array object type {{tt|S}} and {{tt|I}}, as long as at least one of which is a program-defined type. Such specializations shall be usable in [[cpp/language/constant expression|constant expressions]] and have type {{c|const bool}}.
  

Revision as of 22:19, 21 June 2020

 
 
Iterator library
Iterator concepts
sized_sentinel_for
(C++20)

Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
Defined in header <iterator>
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>>;

    };
(1) (since C++20)
template<class S, class I>
  inline constexpr disable_sized_sentinel_for = false;
(2) (since C++20)
1) The 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.
2) The 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.
The variable template is allowed to be specialized 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 shall be usable in constant expressions and have type const bool.

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. sized_sentinel_for<S, I> is satisfied only if:

  • If n is representable by std::iter_difference_t<I>, then s - i is well-defined and equals n; and
  • If -n is representable by std::iter_difference_t<I>, then i - s is well-defined and equals -n.
  • Subtraction between i and s has constant time complexity.

Equality preservation

Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).

Implicit expression variations

A requires expression that uses an expression that is non-modifying for some constant lvalue operand also requires implicit expression variations.