Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/iterator/incrementable"

From cppreference.com
< cpp‎ | iterator
m (See also: P1754R1)
m (fmt, .)
 
(One intermediate revision by one user not shown)
Line 3: Line 3:
 
{{dcl begin}}
 
{{dcl begin}}
 
{{dcl header|iterator|since=c++20}}
 
{{dcl header|iterator|since=c++20}}
{{dcl | since=c++20 | 1=
+
{{dcl|since=c++20|1=
template<class I>
+
template< class I >
 
     concept incrementable =
 
     concept incrementable =
 
         std::regular<I> &&
 
         std::regular<I> &&
Line 14: Line 14:
 
{{dcl end}}
 
{{dcl end}}
  
This concept specifies requirements on types that can be incremented with the pre- and post-increment operators, whose increment operations are equality-preserving, and the type is {{lc|std::equality_comparable}}.  
+
This concept specifies requirements on types that can be incremented with the pre- and post-increment operators, whose increment operations are [[cpp/concepts#Equality preservation|equality-preserving]], and the type is {{lc|std::equality_comparable}}.
  
 
Unlike with {{lc|std::weakly_incrementable}}, which only support single-pass algorithms, multi-pass one-directional algorithms can be used with types that model {{tt|std::incrementable}}.
 
Unlike with {{lc|std::weakly_incrementable}}, which only support single-pass algorithms, multi-pass one-directional algorithms can be used with types that model {{tt|std::incrementable}}.
Line 20: Line 20:
 
===Semantic requirements===
 
===Semantic requirements===
 
{{tt|I}} models {{tt|std::incrementable}} only if given any two incrementable objects {{tt|a}} and {{tt|b}} of type {{tt|I}}:
 
{{tt|I}} models {{tt|std::incrementable}} only if given any two incrementable objects {{tt|a}} and {{tt|b}} of type {{tt|I}}:
* {{c|bool(a {{==}} b)}} implies {{c|bool(a++ {{==}} b)}}, and
+
* {{c|1=bool(a == b)}} implies {{c|1=bool(a++ == b)}}, and
* {{c|bool(a {{==}} b)}} implies {{c|bool(((void)a++, a) {{==}} ++b)}}
+
* {{c|1=bool(a == b)}} implies {{c|1=bool(((void)a++, a) == ++b)}}.
  
 
{{cpp/concepts/equality preservation}}
 
{{cpp/concepts/equality preservation}}
  
=== See also ===
+
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc inc | cpp/iterator/dsc weakly_incrementable}}
+
{{dsc inc|cpp/iterator/dsc weakly_incrementable}}
{{dsc inc | cpp/concepts/dsc same_as}}
+
{{dsc inc|cpp/concepts/dsc same_as}}
 
{{dsc end}}
 
{{dsc end}}
  
 
{{langlinks|de|es|ja|ru|zh}}
 
{{langlinks|de|es|ja|ru|zh}}

Latest revision as of 22:03, 30 September 2023

 
 
Iterator library
Iterator concepts
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 I >

    concept incrementable =
        std::regular<I> &&
        std::weakly_incrementable<I> &&
        requires(I i) {
            { i++ } -> std::same_as<I>;

        };
(since C++20)

This concept specifies requirements on types that can be incremented with the pre- and post-increment operators, whose increment operations are equality-preserving, and the type is std::equality_comparable.

Unlike with std::weakly_incrementable, which only support single-pass algorithms, multi-pass one-directional algorithms can be used with types that model std::incrementable.

[edit] Semantic requirements

I models std::incrementable only if given any two incrementable objects a and b of type I:

  • bool(a == b) implies bool(a++ == b), and
  • bool(a == b) implies bool(((void)a++, a) == ++b).

[edit] Equality preservation

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

[edit] See also

specifies that a semiregular type can be incremented with pre- and post-increment operators
(concept) [edit]
(C++20)
specifies that a type is the same as another type
(concept) [edit]