[incrementable.traits] # 24 Iterators library [[iterators]](./#iterators) ## 24.3 Iterator requirements [[iterator.requirements]](iterator.requirements#incrementable.traits) ### 24.3.2 Associated types [[iterator.assoc.types]](iterator.assoc.types#incrementable.traits) #### 24.3.2.1 Incrementable traits [incrementable.traits] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L744) To implement algorithms only in terms of incrementable types, it is often necessary to determine the difference type that corresponds to a particular incrementable type[.](#1.sentence-1) Accordingly, it is required that if WI is the name of a type that models the[weakly_incrementable](iterator.concept.winc#concept:weakly_incrementable "24.3.4.4 Concept weakly_­incrementable [iterator.concept.winc]") concept ([[iterator.concept.winc]](iterator.concept.winc "24.3.4.4 Concept weakly_­incrementable")), the typeiter_difference_t be defined as the incrementable type's difference type[.](#1.sentence-2) [🔗](#lib:incrementable_traits) namespace std {template struct incrementable_traits { }; templaterequires is_object_vstruct incrementable_traits {using difference_type = ptrdiff_t; }; templatestruct incrementable_traits: incrementable_traits { }; templaterequires requires { typename T::difference_type; }struct incrementable_traits {using difference_type = typename T::difference_type; }; templaterequires (!requires { typename T::difference_type; } &&requires(const T& a, const T& b) { { a - b } -> [integral](concepts.arithmetic#concept:integral "18.4.7 Arithmetic concepts [concepts.arithmetic]"); })struct incrementable_traits {using difference_type = make_signed_t() - declval())>; }; templateusing iter_difference_t = *see below*;} [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L790) Let RI be remove_cvref_t[.](#2.sentence-1) The type iter_difference_t denotes - [(2.1)](#2.1) incrementable_traits​::​difference_type if iterator_traits names a specialization generated from the primary template, and - [(2.2)](#2.2) iterator_traits​::​difference_type otherwise[.](#2.sentence-2) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L803) Users may specialize incrementable_traits on program-defined types[.](#3.sentence-1)