Difference between revisions of "cpp/iterator/iter t"
From cppreference.com
m (fmt) |
(Link update.) |
||
(One intermediate revision by one user not shown) | |||
Line 13: | Line 13: | ||
{{dcl|num=3|since=c++23|1= | {{dcl|num=3|since=c++23|1= | ||
template< std::indirectly_readable T > | template< std::indirectly_readable T > | ||
− | using iter_const_reference_t = std::common_reference_t<const std::iter_value_t<T>&&, | + | using iter_const_reference_t = |
− | + | std::common_reference_t<const std::iter_value_t<T>&&, | |
+ | std::iter_reference_t<T>>; | ||
}} | }} | ||
{{dcl|num=4|since=c++20|1= | {{dcl|num=4|since=c++20|1= | ||
Line 23: | Line 24: | ||
template< /*dereferenceable*/ T> | template< /*dereferenceable*/ T> | ||
requires /* see below */ | requires /* see below */ | ||
− | using iter_rvalue_reference_t = decltype(ranges::iter_move(std::declval<T&>())); | + | using iter_rvalue_reference_t = |
+ | decltype(ranges::iter_move(std::declval<T&>())); | ||
}} | }} | ||
{{dcl|num=6|since=c++20|1= | {{dcl|num=6|since=c++20|1= | ||
template< std::indirectly_readable T > | template< std::indirectly_readable T > | ||
− | using iter_common_reference_t = std::common_reference_t<std::iter_reference_t<T>, | + | using iter_common_reference_t = |
− | + | std::common_reference_t<std::iter_reference_t<T>, | |
+ | /*indirect-value-t*/<T>>; | ||
}} | }} | ||
{{dcl h|Helper templates}} | {{dcl h|Helper templates}} | ||
Line 43: | Line 46: | ||
Compute the associated types of an iterator. | Compute the associated types of an iterator. | ||
− | @1@ Computes the | + | @1@ Computes the {{rlp|/#Types and writability|value type}} of {{tt|T}}. |
− | + | * If {{c/core|std::iterator_traits<std::remove_cvref_t<T>>}} is not specialized, then {{c/core|std::iter_value_t<T>}} is {{c/core|std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type}}. | |
− | * If {{c|std::iterator_traits<std::remove_cvref_t<T>>}} is not specialized, then {{c|std::iter_value_t<T>}} is {{c|std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type}}. | + | * Otherwise, it is {{c/core|std::iterator_traits<std::remove_cvref_t<T>>::value_type}}. |
− | * Otherwise, it is {{c|std::iterator_traits<std::remove_cvref_t<T>>::value_type}}. | + | |
@2@ Computes the ''reference type'' of {{tt|T}}. | @2@ Computes the ''reference type'' of {{tt|T}}. | ||
+ | |||
@3@ Computes the ''const reference type'' of {{tt|T}}. | @3@ Computes the ''const reference type'' of {{tt|T}}. | ||
− | @4@ Computes the | + | |
− | + | @4@ Computes the {{rlp|/#Types and writability|difference type}} of {{tt|T}}. | |
− | * If {{c|std::iterator_traits<std::remove_cvref_t<T>>}} is not specialized, then {{c|std::iter_difference_t<T>}} is {{c|std::incrementable_traits<std::remove_cvref_t<T>>::difference_type}}. | + | * If {{c/core|std::iterator_traits<std::remove_cvref_t<T>>}} is not specialized, then {{c/core|std::iter_difference_t<T>}} is {{c/core|std::incrementable_traits<std::remove_cvref_t<T>>::difference_type}}. |
− | * Otherwise, it is {{c|std::iterator_traits<std::remove_cvref_t<T>>::difference_type}}. | + | * Otherwise, it is {{c/core|std::iterator_traits<std::remove_cvref_t<T>>::difference_type}}. |
− | @5@ Computes the ''rvalue reference type'' of {{tt|T}}. The | + | |
+ | @5@ Computes the ''rvalue reference type'' of {{tt|T}}. The constraint on this alias template is satisfied if and only if the expression {{c|ranges::iter_move(std::declval<T&>())}} is valid and has a referenceable type. | ||
+ | |||
@6@ Computes the ''common reference type'' of {{tt|T}}. This is the common reference type between its reference type and an lvalue reference to its value type. | @6@ Computes the ''common reference type'' of {{tt|T}}. This is the common reference type between its reference type and an lvalue reference to its value type. | ||
− | @7@ The exposition-only concept {{tti|dereferenceable}} is satisfied if and only if the expression {{c|*std::declval<T&>()}} is valid and has a referenceable type | + | |
+ | @7@ The exposition-only concept {{tti|dereferenceable}} is satisfied if and only if the expression {{c|*std::declval<T&>()}} is valid and has a [[cpp/meta#Definitions|referenceable type]]. | ||
+ | |||
@8@ The exposition-only alias template {{tti|indirect-value-t}} denotes the following: | @8@ The exposition-only alias template {{tti|indirect-value-t}} denotes the following: | ||
− | + | * {{c/core|std::invoke_result_t<Proj&, /*indirect-value-t*/<I>>}} if {{tt|T}} is the same as {{c/core|std::projected<I, Proj>}} for some types {{tt|I}} and {{tt|Proj}}. | |
− | + | * Otherwise, {{c/core|std::iter_value_t<T>&}}. | |
===Defect reports=== | ===Defect reports=== | ||
{{dr list begin}} | {{dr list begin}} | ||
− | {{dr list item|paper=P2609R3|std=C++20|before={{tt|std::iter_common_reference_t}} was defined in terms | + | {{dr list item|paper=P2609R3|std=C++20|before={{tt|std::iter_common_reference_t}} was defined in terms<br>of {{c/core|std::iter_value_t<T>&}} which incorrectly handled<br>{{lc|std::projected}} types that project into rvalue reference types|after=defined in terms of<br>{{c/core|/*indirect-value-t*/<T>}}<br>to handle such cases}} |
{{dr list end}} | {{dr list end}} | ||
Line 73: | Line 81: | ||
{{dsc inc|cpp/iterator/dsc iterator_traits}} | {{dsc inc|cpp/iterator/dsc iterator_traits}} | ||
{{dsc inc|cpp/ranges/dsc iterator_t}} | {{dsc inc|cpp/ranges/dsc iterator_t}} | ||
+ | {{dsc inc|cpp/ranges/dsc range_reference_t}} | ||
+ | {{dsc inc|cpp/ranges/dsc range_size_t}} | ||
{{dsc end}} | {{dsc end}} | ||
{{langlinks|de|es|ja|ru|zh}} | {{langlinks|de|es|ja|ru|zh}} |
Latest revision as of 22:50, 2 September 2024
Defined in header <iterator>
|
||
template< class T > using iter_value_t = /* see below */; |
(1) | (since C++20) |
template< /*dereferenceable*/ T > using iter_reference_t = decltype(*std::declval<T&>()); |
(2) | (since C++20) |
template< std::indirectly_readable T > using iter_const_reference_t = |
(3) | (since C++23) |
template< class T > using iter_difference_t = /* see below */; |
(4) | (since C++20) |
template< /*dereferenceable*/ T> requires /* see below */ |
(5) | (since C++20) |
template< std::indirectly_readable T > using iter_common_reference_t = |
(6) | (since C++20) |
Helper templates |
||
template< class T > concept /*dereferenceable*/ = /* see below */; |
(7) | (exposition only*) |
template< std::indirectly_readable T > using /*indirect-value-t*/ = /* see below */; |
(8) | (exposition only*) |
Compute the associated types of an iterator.
1) Computes the value type of
T
.
- If std::iterator_traits<std::remove_cvref_t<T>> is not specialized, then std::iter_value_t<T> is std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type.
- Otherwise, it is std::iterator_traits<std::remove_cvref_t<T>>::value_type.
2) Computes the reference type of
T
.3) Computes the const reference type of
T
.4) Computes the difference type of
T
.
- If std::iterator_traits<std::remove_cvref_t<T>> is not specialized, then std::iter_difference_t<T> is std::incrementable_traits<std::remove_cvref_t<T>>::difference_type.
- Otherwise, it is std::iterator_traits<std::remove_cvref_t<T>>::difference_type.
5) Computes the rvalue reference type of
T
. The constraint on this alias template is satisfied if and only if the expression ranges::iter_move(std::declval<T&>()) is valid and has a referenceable type.6) Computes the common reference type of
T
. This is the common reference type between its reference type and an lvalue reference to its value type.7) The exposition-only concept
dereferenceable
is satisfied if and only if the expression *std::declval<T&>() is valid and has a referenceable type.8) The exposition-only alias template
indirect-value-t
denotes the following:
- std::invoke_result_t<Proj&, /*indirect-value-t*/<I>> if
T
is the same as std::projected<I, Proj> for some typesI
andProj
. - Otherwise, std::iter_value_t<T>&.
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
P2609R3 | C++20 | std::iter_common_reference_t was defined in termsof std::iter_value_t<T>& which incorrectly handled std::projected types that project into rvalue reference types |
defined in terms of /*indirect-value-t*/<T> to handle such cases |
[edit] See also
(C++20) |
specifies that a type is indirectly readable by applying operator * (concept) |
(C++20) |
specifies that a semiregular type can be incremented with pre- and post-increment operators (concept) |
(C++20) |
computes the value type of an indirectly_readable type (class template) |
(C++20) |
computes the difference type of a weakly_incrementable type (class template) |
provides uniform interface to the properties of an iterator (class template) | |
(C++20)(C++23)(C++20)(C++23) |
obtains iterator and sentinel types of a range (alias template) |
obtains reference types of a range (alias template) | |
(C++20)(C++20)(C++20) |
obtains size, difference, and value types of a range (alias template) |